{
  "data": {
    "id": "aVd2LeDNaFUd7PcZ2",
    "actId": "lWYz5Fzdg8rrm8N7r",
    "userId": "9Um4NEFR7z42j35AD",
    "startedAt": "2026-08-16T17:54:34.039Z",
    "finishedAt": "2026-08-16T17:55:27.922Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 53799,
      "runTimeSecs": 53.799,
      "computeUnits": 0.059776666666666665,
      "imageSizeBytes": 527861248
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"TikTok Metrics Scraper input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Input handling\",\n      \"type\": \"string\",\n      \"description\": \"Choose how to use the inputs below. Auto-detect accepts video URLs, profile URLs, and @handles in the same list.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"auto\",\n        \"knownUrls\",\n        \"profileUrls\"\n      ],\n      \"enumTitles\": [\n        \"Auto-detect URLs and handles\",\n        \"Video URLs only\",\n        \"Profile discovery only\"\n      ],\n      \"sectionCaption\": \"Choose TikTok inputs\",\n      \"sectionDescription\": \"Paste TikTok video URLs, profile URLs, or @handles once. Video URLs collect metrics directly. Profile URLs and @handles discover public recent videos first, then collect metrics for those videos.\",\n      \"default\": \"auto\"\n    },\n    \"startUrls\": {\n      \"title\": \"TikTok URLs or @handles\",\n      \"type\": \"array\",\n      \"description\": \"Paste public TikTok video URLs, mobile/share URLs, profile URLs, or @handles. Every direct video input is processed unless you set an optional total row cap.\",\n      \"editor\": \"stringList\",\n      \"minItems\": 0,\n      \"uniqueItems\": true,\n      \"items\": {\n        \"type\": \"string\",\n        \"pattern\": \"^\\\\s*(?:(?:https?:\\\\/\\\\/)?(?:(?:www\\\\.|m\\\\.|vm\\\\.|vt\\\\.)?tiktok\\\\.com)\\\\/\\\\S+|@[A-Za-z0-9._-]+|[A-Za-z0-9._-]+)\\\\s*$\"\n      },\n      \"default\": [\n        \"https://www.tiktok.com/@mrbeast/video/7654638524729216287\"\n      ],\n      \"prefill\": [\n        \"https://www.tiktok.com/@mrbeast/video/7654638524729216287\"\n      ]\n    },\n    \"urls\": {\n      \"title\": \"Legacy video URLs\",\n      \"type\": \"array\",\n      \"description\": \"Backward-compatible hidden field for API users that send known TikTok video URLs as urls.\",\n      \"editor\": \"hidden\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": []\n    },\n    \"profileUrls\": {\n      \"title\": \"Legacy profile URLs\",\n      \"type\": \"array\",\n      \"description\": \"Backward-compatible hidden field for API users that send TikTok profile URLs or @handles as profileUrls.\",\n      \"editor\": \"hidden\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": []\n    },\n    \"maxItems\": {\n      \"title\": \"Optional total row cap\",\n      \"type\": \"integer\",\n      \"description\": \"Optional maximum metric rows across direct videos and profile discovery. Leave blank to process every public item the Actor can find. Large values such as 999999 are accepted.\",\n      \"editor\": \"number\",\n      \"minimum\": 1\n    },\n    \"includeProfileMetrics\": {\n      \"title\": \"Add profile metrics\",\n      \"type\": \"boolean\",\n      \"description\": \"Add best-effort public profile follower, following, total likes, and video counts when TikTok exposes them in public page data.\",\n      \"editor\": \"checkbox\",\n      \"sectionCaption\": \"Enrichment\",\n      \"sectionDescription\": \"Optional profile metrics for direct video URLs and discovered profile videos.\",\n      \"default\": true\n    },\n    \"includeAuthorProfileMetrics\": {\n      \"title\": \"Legacy profile metrics flag\",\n      \"type\": \"boolean\",\n      \"description\": \"Backward-compatible hidden field for API users that send includeAuthorProfileMetrics.\",\n      \"editor\": \"hidden\"\n    },\n    \"requestTimeoutSecs\": {\n      \"title\": \"Request timeout\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum seconds to wait for each public TikTok request.\",\n      \"editor\": \"number\",\n      \"sectionCaption\": \"Run options\",\n      \"sectionDescription\": \"Tune public request behavior and decide whether the run should fail when no public metrics are exposed. Defaults are recommended for most users.\",\n      \"default\": 20,\n      \"minimum\": 5\n    },\n    \"maxConcurrency\": {\n      \"title\": \"Max concurrency\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of TikTok URLs to resolve at the same time.\",\n      \"editor\": \"number\",\n      \"default\": 3,\n      \"minimum\": 1\n    },\n    \"failOnNoMetrics\": {\n      \"title\": \"Fail when no metrics are exposed\",\n      \"type\": \"boolean\",\n      \"description\": \"Fail the run if none of the input URLs expose public metrics. Individual URLs without metrics still emit rows with structured statuses.\",\n      \"editor\": \"checkbox\",\n      \"default\": false\n    }\n  }\n}",
    "readme": "# TikTok Metrics Scraper\n\n## 📊 What does TikTok Metrics Scraper do?\n\nTikTok Metrics Scraper collects public TikTok video metrics and profile metrics\nfrom TikTok video URLs, share links, profile URLs, and `@handles`.\n\nUse it when you need clean TikTok data for creator research, influencer\nreporting, campaign tracking, competitor monitoring, social analytics,\ndashboards, warehouse loads, and scheduled metric snapshots.\n\nThe Actor returns flat CSV/API-friendly rows with TikTok views, likes, comments,\nshares, saves, reposts, profile stats, IDs, captions, hashtags, music,\nthumbnails, timestamps, status fields, and metric quality labels.\n\nThis Actor does not log in, use cookies, scrape private TikTok content, collect\ncomment text, or bypass TikTok access controls. It only returns data that is\navailable from public TikTok surfaces at run time.\n\nWith TikTok Metrics Scraper, you can:\n\n- 📈 Track TikTok video performance from known video URLs and share links.\n- 👤 Discover recent public videos from TikTok profile URLs and `@handles`.\n- 💬 Collect public views, likes, comments, shares, saves, and reposts when\n  available.\n- 🧑‍🎤 Add public profile metrics such as followers, following, total likes, and\n  video counts.\n- 🆔 Extract useful IDs such as `profileId` and `postId`.\n- 🎵 Save captions, hashtags, music metadata, thumbnails, duration, and created\n  dates.\n- 🎯 Check metric precision and availability instead of treating every count as\n  equally exact.\n- 📦 Export results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## 📦 What TikTok metric data can I extract?\n\nEach dataset row represents one TikTok video.\n\n| Data group         | Example fields                                                                               |\n| ------------------ | -------------------------------------------------------------------------------------------- |\n| 🔗 URL identity    | `inputUrl`, `postUrl`, `profileUrl`                                                          |\n| 🆔 TikTok IDs      | `profileId`, `postId`, `postType`                                                            |\n| 🧾 Content details | `description`, `publishedAt`, `thumbnailUrl`, `videoDurationSeconds`, hashtags, `musicTitle` |\n| 👤 Profile details | `profileHandle`, `profileName`, `profileAvatarUrl`, `profileVerified`                        |\n| 📊 Video metrics   | `views`, `likes`, `comments`, `shares`, `saves`, `reposts`                                   |\n| 👥 Profile metrics | `profileFollowersCount`, `profileFollowingCount`, `profileLikesCount`, `profileVideosCount`  |\n| 🎯 Metric quality  | `postMetricStatus`, `profileMetricStatus`                                                    |\n| 🚦 Row status      | `status`, `statusReason`, `scrapedAt`                                                        |\n\nMetric availability depends on what TikTok exposes publicly for each video or\nprofile. If a public source does not expose a metric, the Actor marks that\nmetric as unavailable instead of filling it with a fake zero.\n\n## ⚙️ Can I use this Actor through an API?\n\nYes. You can run TikTok Metrics Scraper manually in Apify Console or use it\nthrough:\n\n- Apify API\n- Python SDK\n- Node.js SDK\n- Webhooks\n- Scheduled runs\n- Apify integrations\n\nThis makes it useful for social media dashboards, influencer lists, competitive\nintelligence, creator databases, campaign reporting, data warehouses, and\nautomated market research workflows.\n\n## 🎯 Why scrape TikTok video and profile metrics?\n\nTikTok public metrics help you understand which creators, videos, sounds,\nhashtags, campaigns, and competitors are gaining traction.\n\n| Use case                     | How TikTok metric data helps                                                      |\n| ---------------------------- | --------------------------------------------------------------------------------- |\n| 📈 Track creator performance | Monitor public engagement across known creator video URLs.                        |\n| 🧑‍🎤 Research influencers      | Compare profile audience size, video volume, and recent video performance.        |\n| 📣 Measure campaigns         | Collect repeatable snapshots for campaign videos, branded posts, and promotions.  |\n| 🕵️ Monitor competitors       | Track public video metrics for competing brands, products, or creators.           |\n| 🎵 Analyze content signals   | Keep captions, hashtags, music, thumbnails, duration, and created dates together. |\n| 📊 Build reporting workflows | Feed normalized TikTok metrics into dashboards, spreadsheets, and BI tools.       |\n| 🔎 Audit metric availability | Separate available, partial, unavailable, and failed rows cleanly.                |\n\n## 💵 How much does scraping TikTok metrics cost?\n\nTikTok Metrics Scraper uses Pay Per Event pricing: **$2.00 per 1,000 TikTok\nmetric rows** ($0.002 per row), with platform usage included. Higher Apify\nsubscription tiers may receive lower per-row pricing on the Actor's\n**Pricing** tab.\n\nStart with a small batch of 3 to 10 URLs when testing. The run summary and\ndataset statuses show which URLs resolved, which returned public metrics, which\nreturned no public metrics, and whether any URLs failed.\n\n## 🚀 How do I use TikTok Metrics Scraper?\n\n1. Create or log in to your Apify account.\n2. Open **TikTok Metrics Scraper**.\n3. Choose **Auto-detect URLs and handles**, **Video URLs only**, or **Profile\n   discovery only**.\n4. Paste TikTok video URLs, share links, profile URLs, `@handles`, or a mix of\n   them.\n5. Set an optional total row cap, or leave it blank to process every direct input.\n6. Leave the default settings for your first run.\n7. Click **Start**.\n8. Open the **Output** tab to inspect the dataset and run summary.\n9. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## ⬇️ Input\n\nThe main input is `startUrls`. Paste at least one TikTok video URL, share link,\nprofile URL, or `@handle`. `https://` is optional for normal TikTok URLs.\n\nFor a quick test, run a known public MrBeast TikTok video:\n\n```json\n{\n    \"mode\": \"auto\",\n    \"startUrls\": [\"https://www.tiktok.com/@mrbeast/video/7654638524729216287\"],\n    \"includeProfileMetrics\": true\n}\n```\n\nIn **Auto-detect URLs and handles** mode, you can paste direct video URLs and\nprofile inputs into the same list. Every direct video input is processed unless\nyou set an optional total row cap.\n\n### 🔗 TikTok URLs and handles\n\nSupported input shapes include:\n\n```text\nwww.tiktok.com/@creator/video/1234567890123456789\nhttps://www.tiktok.com/@creator/video/1234567890123456789\nhttps://www.tiktok.com/t/ZTxxxxxxxx/\nhttps://vm.tiktok.com/ZMxxxxxxxx/\nhttps://vt.tiktok.com/ZSxxxxxxxx/\nhttps://www.tiktok.com/@creator\n@creator\ncreator\ncreator.name\n```\n\nBest results usually come from direct public video URLs and public profile URLs\nthat open in a logged-out browser.\n\n### 👤 Profile discovery\n\nUse profile discovery when you want the Actor to find recent public videos from\na TikTok profile before collecting metrics.\n\n```json\n{\n    \"mode\": \"profileUrls\",\n    \"startUrls\": [\"@mrbeast\"],\n    \"maxItemsPerProfile\": 10,\n    \"includeProfileMetrics\": true\n}\n```\n\nUse `maxItemsPerProfile` to control how many public video URLs are discovered\nfrom each profile. Set `maxItems` only when you also want an optional cap across\nthe whole run.\n\n### 🎛️ Settings\n\n| Option                  | What it does                                                                                   |\n| ----------------------- | ---------------------------------------------------------------------------------------------- |\n| `mode`                  | `auto` to detect mixed inputs, `knownUrls` for video URLs only, or `profileUrls` for profiles. |\n| `startUrls`             | TikTok video URLs, share links, profile URLs, `@handles`, or raw handles such as `mrbeast`.    |\n| `maxItems`              | Optional total row cap. Leave blank to process every direct video input.                       |\n| `maxItemsPerProfile`    | Maximum public video URLs to discover from each profile input.                                 |\n| `includeProfileMetrics` | Adds best-effort public follower, following, total likes, and video counts.                    |\n| `maxConcurrency`        | Controls how many TikTok URLs are resolved at the same time.                                   |\n| `requestTimeoutSecs`    | Maximum wait time for each public TikTok request.                                              |\n| `failOnNoMetrics`       | Fails the run if none of the input URLs expose public metrics.                                 |\n\n## ⬆️ Output sample\n\nThe results are stored in the default dataset. Each result is one TikTok video\nrow.\n\n```json\n{\n    \"platform\": \"tiktok\",\n    \"inputUrl\": \"www.tiktok.com/@examplecreator/video/7651772538292342046\",\n    \"postUrl\": \"https://www.tiktok.com/@examplecreator/video/7651772538292342046\",\n    \"postId\": \"7651772538292342046\",\n    \"postType\": \"video\",\n    \"description\": \"Example caption text #marketing #tiktok\",\n    \"publishedAt\": \"2026-06-22T12:00:00.000Z\",\n    \"thumbnailUrl\": \"https://p16-sign-va.tiktokcdn.com/example.jpg\",\n    \"videoDurationSeconds\": 42,\n    \"hashtagNames\": [\"marketing\", \"tiktok\"],\n    \"musicTitle\": \"Example sound\",\n    \"musicAuthorName\": \"Example Artist\",\n    \"profileId\": \"1234567890123456789\",\n    \"profileHandle\": \"examplecreator\",\n    \"profileName\": \"Example Creator\",\n    \"profileUrl\": \"https://www.tiktok.com/@examplecreator\",\n    \"profileVerified\": true,\n    \"views\": 1234567,\n    \"likes\": 23456,\n    \"comments\": 345,\n    \"shares\": 456,\n    \"saves\": 567,\n    \"reposts\": 12,\n    \"postMetricStatus\": [\n        {\n            \"metric\": \"views\",\n            \"status\": \"present\",\n            \"precision\": \"exact\"\n        }\n    ],\n    \"profileFollowersCount\": 1250000,\n    \"profileFollowingCount\": 418,\n    \"profileLikesCount\": 24800000,\n    \"profileVideosCount\": 412,\n    \"profileMetricStatus\": [\n        {\n            \"metric\": \"profileFollowersCount\",\n            \"status\": \"present\",\n            \"precision\": \"exact\"\n        }\n    ],\n    \"status\": \"ok\",\n    \"statusReason\": null,\n    \"scrapedAt\": \"2026-06-22T12:05:00.000Z\"\n}\n```\n\n## 🎯 Metric precision and availability\n\nTikTok public pages can expose full integers, compact display counts, or already\nrounded public counts. TikTok Metrics Scraper labels metric precision instead\nof pretending all numbers are equally exact.\n\n| Precision         | Meaning                                                                               |\n| ----------------- | ------------------------------------------------------------------------------------- |\n| `exact`           | TikTok public data exposed a full integer that does not look display-rounded.         |\n| `display_rounded` | TikTok public data exposed a compact display value such as `1.2K`, `3.4M`, or `5B`.   |\n| `likely_rounded`  | TikTok public data exposed a large bucketed integer that is probably already rounded. |\n| `unavailable`     | The public source did not expose that metric.                                         |\n\n`postMetricStatus` and `profileMetricStatus` show metric-by-metric status and\nprecision. The top-level metric columns hold the counts.\n\nWhen both a compact display count and a full integer are present, the Actor\nprefers the full integer. It does not emit derived engagement-rate columns.\nCalculate rates downstream from the returned counts and precision labels if you\nneed them.\n\n## 🚦 Output statuses\n\n| Status                       | Meaning                                                                        |\n| ---------------------------- | ------------------------------------------------------------------------------ |\n| `ok`                         | At least one public engagement metric was collected.                           |\n| `resolved_no_public_metrics` | The URL resolved, but public sources did not expose engagement counts.         |\n| `blocked_or_challenged`      | TikTok returned a challenge, login wall, or access page before metrics loaded. |\n| `invalid_url`                | The input is not a valid TikTok URL or `@handle`.                              |\n| `unsupported_url`            | The input is a valid TikTok URL, but that TikTok surface is not supported.     |\n| `failed`                     | A request, parser, or runtime error happened.                                  |\n\n## 🧭 Practical notes\n\nThis Actor collects public TikTok data only. It does not use login, cookies,\nprivate accounts, or private content access.\n\nProfile discovery is best effort. Some profiles expose profile metrics but not\nrecent public video URLs in the public surfaces available at run time.\n\nTikTok counts change continuously. Treat each run as a point-in-time snapshot.\nFor monitoring, schedule repeated runs and compare rows by `postId` and\n`scrapedAt`.\n\nFor large TikTok URL lists, split work into smaller runs. This keeps retries,\ntimeouts, and result inspection easier to manage.\n\n## ❓ Common questions\n\n### Can this scrape TikTok saves and reposts?\n\nThe dataset includes fields for `saves` and `reposts`. The Actor\ncollects them when TikTok exposes those metrics in public page data. If TikTok\ndoes not expose them for a specific video, the fields are marked unavailable\nwith `postMetricStatus`.\n\n### Can this scrape TikTok comments?\n\nThis Actor collects the public comment count. It does not scrape comment text,\ncomment authors, or comment threads.\n\n### Can this scrape TikTok followers?\n\nYes, when TikTok exposes public profile metrics. The Actor can return follower,\nfollowing, total likes, and video counts for the creator profile.\n\n### Can I use it for TikTok competitor tracking?\n\nYes. Paste public competitor video URLs, profile URLs, or handles, then schedule\nthe Actor to collect repeat metric snapshots over time.\n\n### Can I run it through the Apify API?\n\nYes. The Actor is designed for both Apify Console runs and API workflows. Use\nthe flat output rows for dashboards, data warehouses, exports, and monitoring\npipelines.\n\n### Why are some metrics unavailable?\n\nTikTok does not expose every metric on every public surface. When a metric is\nmissing, the Actor keeps the row, marks the metric unavailable, and includes\nstatus fields so your pipeline can handle the row cleanly.\n\n## 🔗 Related social media scrapers\n\nContinue the same workflow on this platform or compare public data across\nplatforms.\n\n### Continue on TikTok\n\n- [TikTok Profile Scraper](https://apify.com/chronometrica/tiktok-channel-scraper)\n  — collect public creator details, links, and audience stats.\n- [TikTok Search Scraper](https://apify.com/chronometrica/tiktok-search-scraper)\n  — find public videos, creators, and metrics by keyword.\n- [TikTok Comments Scraper](https://apify.com/chronometrica/tiktok-comments-scraper)\n  — collect public comments, replies, authors, likes, and thread links.\n- [TikTok Transcript Scraper](https://apify.com/chronometrica/tiktok-transcript-scraper)\n  — extract public caption text and timestamped segments.\n\n### Compare metrics across platforms\n\n- [Facebook Metrics Scraper](https://apify.com/chronometrica/facebook-metrics-scraper)\n  — collect public post, Reel, video, photo, and profile metrics.\n- [Instagram Metrics Scraper](https://apify.com/chronometrica/instagram-metrics-scraper)\n  — collect public post, Reel, carousel, profile, and collaboration metrics.\n- [YouTube Metrics Scraper](https://apify.com/chronometrica/youtube-metrics-scraper)\n  — collect public video, Short, channel, and engagement metrics.\n- [Snapchat Spotlight Metrics Scraper](https://apify.com/chronometrica/snapchat-metrics-scraper)\n  — collect public Spotlight post views, engagement, creator, and media data.\n- [X Post Metrics Scraper](https://apify.com/chronometrica/x-post-metrics)\n  — collect public post views, engagement, media, and author details.\n",
    "changelog": "# Changelog\n\n## 0.1.10\n\n- Improved metric matching for direct TikTok video URLs so public counts are\n  tied more reliably to the requested video.\n\n## 0.1.9\n\n- Switched the public quick-start example and Console prefill to a MrBeast\n  TikTok video while keeping the same buyer-facing input shape.\n\n## 0.1.8\n\n- Accepted raw dotted TikTok handles as profile inputs.\n- Aligned the README quick-start example with the Actor example input and\n  Console prefill.\n- Added tests that keep the public quick-start sample and input prefill aligned.\n\n## 0.1.7\n\n- Simplified `postMetricStatus` and `profileMetricStatus` objects to include\n  only `metric`, `status`, and `precision`.\n- Kept metric counts in the top-level metric columns such as `views`, `likes`,\n  `comments`, `shares`, `saves`, `reposts`, and profile metric count fields.\n- Updated the dataset schema and output sample to match the cleaner metric\n  status shape.\n\n## 0.1.6\n\n- Standardized public dataset column names for easier cross-platform reporting,\n  including `postUrl`, `publishedAt`, `views`, `likes`, `comments`,\n  `postMetricStatus`, and `profileMetricStatus`.\n- Kept TikTok-specific public metrics that TikTok exposes, including `shares`,\n  `saves`, `reposts`, `profileLikesCount`, and `profileVideosCount`.\n- Removed non-essential technical fields from normal dataset rows.\n\n## 0.1.5\n\n- Added metric-by-metric status and precision details for post and profile\n  metrics.\n- Removed derived engagement-rate fields so exports stay focused on collected\n  public metrics.\n- Removed non-essential operational details from public dataset rows.\n- Simplified the public dataset schema and default table view around core\n  TikTok video, profile, metric, and status fields.\n\n## 0.1.4\n\n- Added one retry for transient public TikTok fetch failures.\n- Improved handling for TikTok responses with partial public data availability.\n- Improved status handling for successful direct video-page rows.\n\n## 0.1.3\n\n- Prefer full integer metric fields over compact TikTok display counts when both\n  are exposed in public data.\n- Mark metrics parsed from compact display values such as `1.2K` or `3.4M` as\n  `display_rounded` instead of `exact`.\n- Mark large bucketed public integers such as `17,900` or `1,500,000` as\n  `likely_rounded` when they match TikTok-style display precision.\n- Added metric precision details so users can distinguish exact, rounded, and\n  unavailable counts.\n- Kept normal output rows focused on stable public fields.\n\n## 0.1.2\n\n- Improved profile discovery for `@handle` inputs when TikTok exposes limited\n  public profile data.\n- Improved profile rows that include both public profile metrics and recent\n  public video links.\n- Improved handling for profiles with partial public data.\n\n## 0.1.1\n\n- Improved direct video metric extraction when TikTok exposes public video data.\n- Preserved richer metric coverage when multiple public values are available.\n- Improved collection of saves and repost counts when TikTok exposes them.\n\n## 0.1.0\n\n- Initial MVP for public TikTok video metric snapshots.\n- Added direct video URL support for public TikTok metric snapshots.\n- Added optional public profile discovery for recent video URLs.\n- Added flat dataset rows with public video fields, profile fields, metrics,\n  statuses, and run summary counters.\n",
    "actorDefinition": {
      "$schema": "https://apify.com/schemas/v1/actor.ide.json",
      "actorSpecification": 1,
      "name": "tiktok-metrics-scraper",
      "title": "TikTok Metrics Scraper - Video & Profile Stats",
      "description": "Scrape public TikTok video and profile metrics from video URLs, share links, profile URLs, and @handles. Collect views, likes, comments, shares, saves, reposts, profile stats, IDs, captions, hashtags, music, timestamps, precision labels, and clean CSV/API rows.",
      "seoTitle": "TikTok Metrics Scraper | Views, Saves & Profiles",
      "seoDescription": "Scrape TikTok metrics from video URLs, share links, profiles, and @handles. Get views, likes, comments, shares, saves, reposts, profile stats, and IDs.",
      "categories": [
        "SOCIAL_MEDIA"
      ],
      "version": "0.1",
      "buildTag": "latest",
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 1024
      },
      "exampleRunInput": {
        "contentType": "application/json; charset=utf-8",
        "body": "{\n    \"mode\": \"auto\",\n    \"startUrls\": [\n        \"https://www.tiktok.com/@mrbeast/video/7654638524729216287\"\n    ],\n    \"includeProfileMetrics\": true\n}"
      },
      "input": {
        "title": "TikTok Metrics Scraper input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Input handling",
            "type": "string",
            "description": "Choose how to use the inputs below. Auto-detect accepts video URLs, profile URLs, and @handles in the same list.",
            "editor": "select",
            "enum": [
              "auto",
              "knownUrls",
              "profileUrls"
            ],
            "enumTitles": [
              "Auto-detect URLs and handles",
              "Video URLs only",
              "Profile discovery only"
            ],
            "sectionCaption": "Choose TikTok inputs",
            "sectionDescription": "Paste TikTok video URLs, profile URLs, or @handles once. Video URLs collect metrics directly. Profile URLs and @handles discover public recent videos first, then collect metrics for those videos.",
            "default": "auto"
          },
          "startUrls": {
            "title": "TikTok URLs or @handles",
            "type": "array",
            "description": "Paste public TikTok video URLs, mobile/share URLs, profile URLs, or @handles. Every direct video input is processed unless you set an optional total row cap.",
            "editor": "stringList",
            "minItems": 0,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^\\s*(?:(?:https?:\\/\\/)?(?:(?:www\\.|m\\.|vm\\.|vt\\.)?tiktok\\.com)\\/\\S+|@[A-Za-z0-9._-]+|[A-Za-z0-9._-]+)\\s*$"
            },
            "default": [
              "https://www.tiktok.com/@mrbeast/video/7654638524729216287"
            ],
            "prefill": [
              "https://www.tiktok.com/@mrbeast/video/7654638524729216287"
            ]
          },
          "urls": {
            "title": "Legacy video URLs",
            "type": "array",
            "description": "Backward-compatible hidden field for API users that send known TikTok video URLs as urls.",
            "editor": "hidden",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "profileUrls": {
            "title": "Legacy profile URLs",
            "type": "array",
            "description": "Backward-compatible hidden field for API users that send TikTok profile URLs or @handles as profileUrls.",
            "editor": "hidden",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "maxItems": {
            "title": "Optional total row cap",
            "type": "integer",
            "description": "Optional maximum metric rows across direct videos and profile discovery. Leave blank to process every public item the Actor can find. Large values such as 999999 are accepted.",
            "editor": "number",
            "minimum": 1
          },
          "includeProfileMetrics": {
            "title": "Add profile metrics",
            "type": "boolean",
            "description": "Add best-effort public profile follower, following, total likes, and video counts when TikTok exposes them in public page data.",
            "editor": "checkbox",
            "sectionCaption": "Enrichment",
            "sectionDescription": "Optional profile metrics for direct video URLs and discovered profile videos.",
            "default": true
          },
          "includeAuthorProfileMetrics": {
            "title": "Legacy profile metrics flag",
            "type": "boolean",
            "description": "Backward-compatible hidden field for API users that send includeAuthorProfileMetrics.",
            "editor": "hidden"
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "type": "integer",
            "description": "Maximum seconds to wait for each public TikTok request.",
            "editor": "number",
            "sectionCaption": "Run options",
            "sectionDescription": "Tune public request behavior and decide whether the run should fail when no public metrics are exposed. Defaults are recommended for most users.",
            "default": 20,
            "minimum": 5
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "type": "integer",
            "description": "Maximum number of TikTok URLs to resolve at the same time.",
            "editor": "number",
            "default": 3,
            "minimum": 1
          },
          "failOnNoMetrics": {
            "title": "Fail when no metrics are exposed",
            "type": "boolean",
            "description": "Fail the run if none of the input URLs expose public metrics. Individual URLs without metrics still emit rows with structured statuses.",
            "editor": "checkbox",
            "default": false
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "TikTok Metrics Scraper output",
        "description": "Metric rows are stored in the default dataset. OUTPUT contains a compact run summary.",
        "properties": {
          "results": {
            "type": "string",
            "title": "Metric results",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "output": {
            "type": "string",
            "title": "Run summary",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/OUTPUT"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "type": "object",
            "properties": {
              "platform": {
                "type": "string",
                "title": "Platform"
              },
              "inputUrl": {
                "type": "string",
                "title": "Input URL"
              },
              "postUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Post URL"
              },
              "postId": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Post ID"
              },
              "postType": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Post Type"
              },
              "description": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Description"
              },
              "publishedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "title": "Published At"
              },
              "thumbnailUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Thumbnail"
              },
              "videoDurationSeconds": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Video Duration (Seconds)"
              },
              "hashtagNames": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "title": "Hashtags"
              },
              "musicId": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Music ID"
              },
              "musicTitle": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Music Title"
              },
              "musicAuthorName": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Music Author"
              },
              "profileId": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Profile ID"
              },
              "profileHandle": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Profile Handle"
              },
              "profileName": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Profile Name"
              },
              "profileUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Profile URL"
              },
              "profileVerified": {
                "type": [
                  "boolean",
                  "null"
                ],
                "title": "Verified"
              },
              "profileAvatarUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Avatar"
              },
              "views": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Views"
              },
              "likes": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Likes"
              },
              "comments": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Comments"
              },
              "shares": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Shares"
              },
              "saves": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Saves"
              },
              "reposts": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Reposts"
              },
              "postMetricStatus": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "properties": {
                    "metric": {
                      "type": "string",
                      "enum": [
                        "views",
                        "likes",
                        "comments",
                        "shares",
                        "saves",
                        "reposts"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "present",
                        "unavailable",
                        "not_attempted"
                      ]
                    },
                    "precision": {
                      "type": "string",
                      "enum": [
                        "exact",
                        "display_rounded",
                        "likely_rounded",
                        "unavailable",
                        "unknown"
                      ]
                    }
                  },
                  "required": [
                    "metric",
                    "status",
                    "precision"
                  ]
                },
                "title": "Post Metric Status",
                "description": "Public status and precision metadata for post-level metrics."
              },
              "profileFollowersCount": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Profile Followers"
              },
              "profileFollowingCount": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Profile Following"
              },
              "profileLikesCount": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Profile Likes"
              },
              "profileVideosCount": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Profile Videos"
              },
              "profileMetricStatus": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "properties": {
                    "metric": {
                      "type": "string",
                      "enum": [
                        "profileFollowersCount",
                        "profileFollowingCount",
                        "profileLikesCount",
                        "profileVideosCount"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "present",
                        "unavailable",
                        "not_attempted"
                      ]
                    },
                    "precision": {
                      "type": "string",
                      "enum": [
                        "exact",
                        "display_rounded",
                        "likely_rounded",
                        "unavailable",
                        "unknown"
                      ]
                    }
                  },
                  "required": [
                    "metric",
                    "status",
                    "precision"
                  ]
                },
                "title": "Profile Metric Status",
                "description": "Public status and precision metadata for profile-level metrics."
              },
              "status": {
                "type": "string",
                "title": "Status"
              },
              "statusReason": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Status Detail"
              },
              "scrapedAt": {
                "type": "string",
                "format": "date-time",
                "title": "Scraped At"
              }
            },
            "required": [
              "inputUrl",
              "status",
              "scrapedAt"
            ]
          },
          "views": {
            "overview": {
              "title": "TikTok metrics",
              "description": "One row per TikTok video, photo post, or profile-discovered content item.",
              "transformation": {
                "fields": [
                  "platform",
                  "inputUrl",
                  "postUrl",
                  "postId",
                  "postType",
                  "description",
                  "publishedAt",
                  "thumbnailUrl",
                  "videoDurationSeconds",
                  "hashtagNames",
                  "musicId",
                  "musicTitle",
                  "musicAuthorName",
                  "profileId",
                  "profileHandle",
                  "profileName",
                  "profileUrl",
                  "profileVerified",
                  "profileAvatarUrl",
                  "views",
                  "likes",
                  "comments",
                  "shares",
                  "saves",
                  "reposts",
                  "postMetricStatus",
                  "profileFollowersCount",
                  "profileFollowingCount",
                  "profileLikesCount",
                  "profileVideosCount",
                  "profileMetricStatus",
                  "status",
                  "statusReason",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "platform": {
                    "label": "Platform",
                    "format": "text"
                  },
                  "inputUrl": {
                    "label": "Input URL",
                    "format": "link"
                  },
                  "postUrl": {
                    "label": "Post URL",
                    "format": "link"
                  },
                  "postId": {
                    "label": "Post ID",
                    "format": "text"
                  },
                  "postType": {
                    "label": "Post Type",
                    "format": "text"
                  },
                  "description": {
                    "label": "Description",
                    "format": "text"
                  },
                  "publishedAt": {
                    "label": "Published At",
                    "format": "date"
                  },
                  "thumbnailUrl": {
                    "label": "Thumbnail",
                    "format": "link"
                  },
                  "videoDurationSeconds": {
                    "label": "Video Duration (Seconds)",
                    "format": "number"
                  },
                  "hashtagNames": {
                    "label": "Hashtags",
                    "format": "object",
                    "title": "Hashtags"
                  },
                  "musicId": {
                    "label": "Music ID",
                    "format": "text"
                  },
                  "musicTitle": {
                    "label": "Music Title",
                    "format": "text"
                  },
                  "musicAuthorName": {
                    "label": "Music Author",
                    "format": "text"
                  },
                  "profileId": {
                    "label": "Profile ID",
                    "format": "text"
                  },
                  "profileHandle": {
                    "label": "Profile Handle",
                    "format": "text"
                  },
                  "profileName": {
                    "label": "Profile Name",
                    "format": "text"
                  },
                  "profileUrl": {
                    "label": "Profile URL",
                    "format": "link"
                  },
                  "profileVerified": {
                    "label": "Verified",
                    "format": "boolean"
                  },
                  "profileAvatarUrl": {
                    "label": "Avatar",
                    "format": "link"
                  },
                  "views": {
                    "label": "Views",
                    "format": "number"
                  },
                  "likes": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "comments": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "shares": {
                    "label": "Shares",
                    "format": "number"
                  },
                  "saves": {
                    "label": "Saves",
                    "format": "number"
                  },
                  "reposts": {
                    "label": "Reposts",
                    "format": "number"
                  },
                  "postMetricStatus": {
                    "label": "Post Metric Status",
                    "format": "object",
                    "title": "Post Metric Status",
                    "description": "Public status and precision metadata for post-level metrics."
                  },
                  "profileFollowersCount": {
                    "label": "Profile Followers",
                    "format": "number"
                  },
                  "profileFollowingCount": {
                    "label": "Profile Following",
                    "format": "number"
                  },
                  "profileLikesCount": {
                    "label": "Profile Likes",
                    "format": "number"
                  },
                  "profileVideosCount": {
                    "label": "Profile Videos",
                    "format": "number"
                  },
                  "profileMetricStatus": {
                    "label": "Profile Metric Status",
                    "format": "object",
                    "title": "Profile Metric Status",
                    "description": "Public status and precision metadata for profile-level metrics."
                  },
                  "status": {
                    "label": "Status",
                    "format": "text"
                  },
                  "statusReason": {
                    "label": "Status Detail",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "date"
                  }
                }
              }
            }
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "changelog": "# Changelog\n\n## 0.1.10\n\n- Improved metric matching for direct TikTok video URLs so public counts are\n  tied more reliably to the requested video.\n\n## 0.1.9\n\n- Switched the public quick-start example and Console prefill to a MrBeast\n  TikTok video while keeping the same buyer-facing input shape.\n\n## 0.1.8\n\n- Accepted raw dotted TikTok handles as profile inputs.\n- Aligned the README quick-start example with the Actor example input and\n  Console prefill.\n- Added tests that keep the public quick-start sample and input prefill aligned.\n\n## 0.1.7\n\n- Simplified `postMetricStatus` and `profileMetricStatus` objects to include\n  only `metric`, `status`, and `precision`.\n- Kept metric counts in the top-level metric columns such as `views`, `likes`,\n  `comments`, `shares`, `saves`, `reposts`, and profile metric count fields.\n- Updated the dataset schema and output sample to match the cleaner metric\n  status shape.\n\n## 0.1.6\n\n- Standardized public dataset column names for easier cross-platform reporting,\n  including `postUrl`, `publishedAt`, `views`, `likes`, `comments`,\n  `postMetricStatus`, and `profileMetricStatus`.\n- Kept TikTok-specific public metrics that TikTok exposes, including `shares`,\n  `saves`, `reposts`, `profileLikesCount`, and `profileVideosCount`.\n- Removed non-essential technical fields from normal dataset rows.\n\n## 0.1.5\n\n- Added metric-by-metric status and precision details for post and profile\n  metrics.\n- Removed derived engagement-rate fields so exports stay focused on collected\n  public metrics.\n- Removed non-essential operational details from public dataset rows.\n- Simplified the public dataset schema and default table view around core\n  TikTok video, profile, metric, and status fields.\n\n## 0.1.4\n\n- Added one retry for transient public TikTok fetch failures.\n- Improved handling for TikTok responses with partial public data availability.\n- Improved status handling for successful direct video-page rows.\n\n## 0.1.3\n\n- Prefer full integer metric fields over compact TikTok display counts when both\n  are exposed in public data.\n- Mark metrics parsed from compact display values such as `1.2K` or `3.4M` as\n  `display_rounded` instead of `exact`.\n- Mark large bucketed public integers such as `17,900` or `1,500,000` as\n  `likely_rounded` when they match TikTok-style display precision.\n- Added metric precision details so users can distinguish exact, rounded, and\n  unavailable counts.\n- Kept normal output rows focused on stable public fields.\n\n## 0.1.2\n\n- Improved profile discovery for `@handle` inputs when TikTok exposes limited\n  public profile data.\n- Improved profile rows that include both public profile metrics and recent\n  public video links.\n- Improved handling for profiles with partial public data.\n\n## 0.1.1\n\n- Improved direct video metric extraction when TikTok exposes public video data.\n- Preserved richer metric coverage when multiple public values are available.\n- Improved collection of saves and repost counts when TikTok exposes them.\n\n## 0.1.0\n\n- Initial MVP for public TikTok video metric snapshots.\n- Added direct video URL support for public TikTok metric snapshots.\n- Added optional public profile discovery for recent video URLs.\n- Added flat dataset rows with public video fields, profile fields, metrics,\n  statuses, and run summary counters.\n",
      "readme": "# TikTok Metrics Scraper\n\n## 📊 What does TikTok Metrics Scraper do?\n\nTikTok Metrics Scraper collects public TikTok video metrics and profile metrics\nfrom TikTok video URLs, share links, profile URLs, and `@handles`.\n\nUse it when you need clean TikTok data for creator research, influencer\nreporting, campaign tracking, competitor monitoring, social analytics,\ndashboards, warehouse loads, and scheduled metric snapshots.\n\nThe Actor returns flat CSV/API-friendly rows with TikTok views, likes, comments,\nshares, saves, reposts, profile stats, IDs, captions, hashtags, music,\nthumbnails, timestamps, status fields, and metric quality labels.\n\nThis Actor does not log in, use cookies, scrape private TikTok content, collect\ncomment text, or bypass TikTok access controls. It only returns data that is\navailable from public TikTok surfaces at run time.\n\nWith TikTok Metrics Scraper, you can:\n\n- 📈 Track TikTok video performance from known video URLs and share links.\n- 👤 Discover recent public videos from TikTok profile URLs and `@handles`.\n- 💬 Collect public views, likes, comments, shares, saves, and reposts when\n  available.\n- 🧑‍🎤 Add public profile metrics such as followers, following, total likes, and\n  video counts.\n- 🆔 Extract useful IDs such as `profileId` and `postId`.\n- 🎵 Save captions, hashtags, music metadata, thumbnails, duration, and created\n  dates.\n- 🎯 Check metric precision and availability instead of treating every count as\n  equally exact.\n- 📦 Export results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## 📦 What TikTok metric data can I extract?\n\nEach dataset row represents one TikTok video.\n\n| Data group         | Example fields                                                                               |\n| ------------------ | -------------------------------------------------------------------------------------------- |\n| 🔗 URL identity    | `inputUrl`, `postUrl`, `profileUrl`                                                          |\n| 🆔 TikTok IDs      | `profileId`, `postId`, `postType`                                                            |\n| 🧾 Content details | `description`, `publishedAt`, `thumbnailUrl`, `videoDurationSeconds`, hashtags, `musicTitle` |\n| 👤 Profile details | `profileHandle`, `profileName`, `profileAvatarUrl`, `profileVerified`                        |\n| 📊 Video metrics   | `views`, `likes`, `comments`, `shares`, `saves`, `reposts`                                   |\n| 👥 Profile metrics | `profileFollowersCount`, `profileFollowingCount`, `profileLikesCount`, `profileVideosCount`  |\n| 🎯 Metric quality  | `postMetricStatus`, `profileMetricStatus`                                                    |\n| 🚦 Row status      | `status`, `statusReason`, `scrapedAt`                                                        |\n\nMetric availability depends on what TikTok exposes publicly for each video or\nprofile. If a public source does not expose a metric, the Actor marks that\nmetric as unavailable instead of filling it with a fake zero.\n\n## ⚙️ Can I use this Actor through an API?\n\nYes. You can run TikTok Metrics Scraper manually in Apify Console or use it\nthrough:\n\n- Apify API\n- Python SDK\n- Node.js SDK\n- Webhooks\n- Scheduled runs\n- Apify integrations\n\nThis makes it useful for social media dashboards, influencer lists, competitive\nintelligence, creator databases, campaign reporting, data warehouses, and\nautomated market research workflows.\n\n## 🎯 Why scrape TikTok video and profile metrics?\n\nTikTok public metrics help you understand which creators, videos, sounds,\nhashtags, campaigns, and competitors are gaining traction.\n\n| Use case                     | How TikTok metric data helps                                                      |\n| ---------------------------- | --------------------------------------------------------------------------------- |\n| 📈 Track creator performance | Monitor public engagement across known creator video URLs.                        |\n| 🧑‍🎤 Research influencers      | Compare profile audience size, video volume, and recent video performance.        |\n| 📣 Measure campaigns         | Collect repeatable snapshots for campaign videos, branded posts, and promotions.  |\n| 🕵️ Monitor competitors       | Track public video metrics for competing brands, products, or creators.           |\n| 🎵 Analyze content signals   | Keep captions, hashtags, music, thumbnails, duration, and created dates together. |\n| 📊 Build reporting workflows | Feed normalized TikTok metrics into dashboards, spreadsheets, and BI tools.       |\n| 🔎 Audit metric availability | Separate available, partial, unavailable, and failed rows cleanly.                |\n\n## 💵 How much does scraping TikTok metrics cost?\n\nTikTok Metrics Scraper uses Pay Per Event pricing: **$2.00 per 1,000 TikTok\nmetric rows** ($0.002 per row), with platform usage included. Higher Apify\nsubscription tiers may receive lower per-row pricing on the Actor's\n**Pricing** tab.\n\nStart with a small batch of 3 to 10 URLs when testing. The run summary and\ndataset statuses show which URLs resolved, which returned public metrics, which\nreturned no public metrics, and whether any URLs failed.\n\n## 🚀 How do I use TikTok Metrics Scraper?\n\n1. Create or log in to your Apify account.\n2. Open **TikTok Metrics Scraper**.\n3. Choose **Auto-detect URLs and handles**, **Video URLs only**, or **Profile\n   discovery only**.\n4. Paste TikTok video URLs, share links, profile URLs, `@handles`, or a mix of\n   them.\n5. Set an optional total row cap, or leave it blank to process every direct input.\n6. Leave the default settings for your first run.\n7. Click **Start**.\n8. Open the **Output** tab to inspect the dataset and run summary.\n9. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## ⬇️ Input\n\nThe main input is `startUrls`. Paste at least one TikTok video URL, share link,\nprofile URL, or `@handle`. `https://` is optional for normal TikTok URLs.\n\nFor a quick test, run a known public MrBeast TikTok video:\n\n```json\n{\n    \"mode\": \"auto\",\n    \"startUrls\": [\"https://www.tiktok.com/@mrbeast/video/7654638524729216287\"],\n    \"includeProfileMetrics\": true\n}\n```\n\nIn **Auto-detect URLs and handles** mode, you can paste direct video URLs and\nprofile inputs into the same list. Every direct video input is processed unless\nyou set an optional total row cap.\n\n### 🔗 TikTok URLs and handles\n\nSupported input shapes include:\n\n```text\nwww.tiktok.com/@creator/video/1234567890123456789\nhttps://www.tiktok.com/@creator/video/1234567890123456789\nhttps://www.tiktok.com/t/ZTxxxxxxxx/\nhttps://vm.tiktok.com/ZMxxxxxxxx/\nhttps://vt.tiktok.com/ZSxxxxxxxx/\nhttps://www.tiktok.com/@creator\n@creator\ncreator\ncreator.name\n```\n\nBest results usually come from direct public video URLs and public profile URLs\nthat open in a logged-out browser.\n\n### 👤 Profile discovery\n\nUse profile discovery when you want the Actor to find recent public videos from\na TikTok profile before collecting metrics.\n\n```json\n{\n    \"mode\": \"profileUrls\",\n    \"startUrls\": [\"@mrbeast\"],\n    \"maxItemsPerProfile\": 10,\n    \"includeProfileMetrics\": true\n}\n```\n\nUse `maxItemsPerProfile` to control how many public video URLs are discovered\nfrom each profile. Set `maxItems` only when you also want an optional cap across\nthe whole run.\n\n### 🎛️ Settings\n\n| Option                  | What it does                                                                                   |\n| ----------------------- | ---------------------------------------------------------------------------------------------- |\n| `mode`                  | `auto` to detect mixed inputs, `knownUrls` for video URLs only, or `profileUrls` for profiles. |\n| `startUrls`             | TikTok video URLs, share links, profile URLs, `@handles`, or raw handles such as `mrbeast`.    |\n| `maxItems`              | Optional total row cap. Leave blank to process every direct video input.                       |\n| `maxItemsPerProfile`    | Maximum public video URLs to discover from each profile input.                                 |\n| `includeProfileMetrics` | Adds best-effort public follower, following, total likes, and video counts.                    |\n| `maxConcurrency`        | Controls how many TikTok URLs are resolved at the same time.                                   |\n| `requestTimeoutSecs`    | Maximum wait time for each public TikTok request.                                              |\n| `failOnNoMetrics`       | Fails the run if none of the input URLs expose public metrics.                                 |\n\n## ⬆️ Output sample\n\nThe results are stored in the default dataset. Each result is one TikTok video\nrow.\n\n```json\n{\n    \"platform\": \"tiktok\",\n    \"inputUrl\": \"www.tiktok.com/@examplecreator/video/7651772538292342046\",\n    \"postUrl\": \"https://www.tiktok.com/@examplecreator/video/7651772538292342046\",\n    \"postId\": \"7651772538292342046\",\n    \"postType\": \"video\",\n    \"description\": \"Example caption text #marketing #tiktok\",\n    \"publishedAt\": \"2026-06-22T12:00:00.000Z\",\n    \"thumbnailUrl\": \"https://p16-sign-va.tiktokcdn.com/example.jpg\",\n    \"videoDurationSeconds\": 42,\n    \"hashtagNames\": [\"marketing\", \"tiktok\"],\n    \"musicTitle\": \"Example sound\",\n    \"musicAuthorName\": \"Example Artist\",\n    \"profileId\": \"1234567890123456789\",\n    \"profileHandle\": \"examplecreator\",\n    \"profileName\": \"Example Creator\",\n    \"profileUrl\": \"https://www.tiktok.com/@examplecreator\",\n    \"profileVerified\": true,\n    \"views\": 1234567,\n    \"likes\": 23456,\n    \"comments\": 345,\n    \"shares\": 456,\n    \"saves\": 567,\n    \"reposts\": 12,\n    \"postMetricStatus\": [\n        {\n            \"metric\": \"views\",\n            \"status\": \"present\",\n            \"precision\": \"exact\"\n        }\n    ],\n    \"profileFollowersCount\": 1250000,\n    \"profileFollowingCount\": 418,\n    \"profileLikesCount\": 24800000,\n    \"profileVideosCount\": 412,\n    \"profileMetricStatus\": [\n        {\n            \"metric\": \"profileFollowersCount\",\n            \"status\": \"present\",\n            \"precision\": \"exact\"\n        }\n    ],\n    \"status\": \"ok\",\n    \"statusReason\": null,\n    \"scrapedAt\": \"2026-06-22T12:05:00.000Z\"\n}\n```\n\n## 🎯 Metric precision and availability\n\nTikTok public pages can expose full integers, compact display counts, or already\nrounded public counts. TikTok Metrics Scraper labels metric precision instead\nof pretending all numbers are equally exact.\n\n| Precision         | Meaning                                                                               |\n| ----------------- | ------------------------------------------------------------------------------------- |\n| `exact`           | TikTok public data exposed a full integer that does not look display-rounded.         |\n| `display_rounded` | TikTok public data exposed a compact display value such as `1.2K`, `3.4M`, or `5B`.   |\n| `likely_rounded`  | TikTok public data exposed a large bucketed integer that is probably already rounded. |\n| `unavailable`     | The public source did not expose that metric.                                         |\n\n`postMetricStatus` and `profileMetricStatus` show metric-by-metric status and\nprecision. The top-level metric columns hold the counts.\n\nWhen both a compact display count and a full integer are present, the Actor\nprefers the full integer. It does not emit derived engagement-rate columns.\nCalculate rates downstream from the returned counts and precision labels if you\nneed them.\n\n## 🚦 Output statuses\n\n| Status                       | Meaning                                                                        |\n| ---------------------------- | ------------------------------------------------------------------------------ |\n| `ok`                         | At least one public engagement metric was collected.                           |\n| `resolved_no_public_metrics` | The URL resolved, but public sources did not expose engagement counts.         |\n| `blocked_or_challenged`      | TikTok returned a challenge, login wall, or access page before metrics loaded. |\n| `invalid_url`                | The input is not a valid TikTok URL or `@handle`.                              |\n| `unsupported_url`            | The input is a valid TikTok URL, but that TikTok surface is not supported.     |\n| `failed`                     | A request, parser, or runtime error happened.                                  |\n\n## 🧭 Practical notes\n\nThis Actor collects public TikTok data only. It does not use login, cookies,\nprivate accounts, or private content access.\n\nProfile discovery is best effort. Some profiles expose profile metrics but not\nrecent public video URLs in the public surfaces available at run time.\n\nTikTok counts change continuously. Treat each run as a point-in-time snapshot.\nFor monitoring, schedule repeated runs and compare rows by `postId` and\n`scrapedAt`.\n\nFor large TikTok URL lists, split work into smaller runs. This keeps retries,\ntimeouts, and result inspection easier to manage.\n\n## ❓ Common questions\n\n### Can this scrape TikTok saves and reposts?\n\nThe dataset includes fields for `saves` and `reposts`. The Actor\ncollects them when TikTok exposes those metrics in public page data. If TikTok\ndoes not expose them for a specific video, the fields are marked unavailable\nwith `postMetricStatus`.\n\n### Can this scrape TikTok comments?\n\nThis Actor collects the public comment count. It does not scrape comment text,\ncomment authors, or comment threads.\n\n### Can this scrape TikTok followers?\n\nYes, when TikTok exposes public profile metrics. The Actor can return follower,\nfollowing, total likes, and video counts for the creator profile.\n\n### Can I use it for TikTok competitor tracking?\n\nYes. Paste public competitor video URLs, profile URLs, or handles, then schedule\nthe Actor to collect repeat metric snapshots over time.\n\n### Can I run it through the Apify API?\n\nYes. The Actor is designed for both Apify Console runs and API workflows. Use\nthe flat output rows for dashboards, data warehouses, exports, and monitoring\npipelines.\n\n### Why are some metrics unavailable?\n\nTikTok does not expose every metric on every public surface. When a metric is\nmissing, the Actor keeps the row, marks the metric unavailable, and includes\nstatus fields so your pipeline can handle the row cleanly.\n\n## 🔗 Related social media scrapers\n\nContinue the same workflow on this platform or compare public data across\nplatforms.\n\n### Continue on TikTok\n\n- [TikTok Profile Scraper](https://apify.com/chronometrica/tiktok-channel-scraper)\n  — collect public creator details, links, and audience stats.\n- [TikTok Search Scraper](https://apify.com/chronometrica/tiktok-search-scraper)\n  — find public videos, creators, and metrics by keyword.\n- [TikTok Comments Scraper](https://apify.com/chronometrica/tiktok-comments-scraper)\n  — collect public comments, replies, authors, likes, and thread links.\n- [TikTok Transcript Scraper](https://apify.com/chronometrica/tiktok-transcript-scraper)\n  — extract public caption text and timestamped segments.\n\n### Compare metrics across platforms\n\n- [Facebook Metrics Scraper](https://apify.com/chronometrica/facebook-metrics-scraper)\n  — collect public post, Reel, video, photo, and profile metrics.\n- [Instagram Metrics Scraper](https://apify.com/chronometrica/instagram-metrics-scraper)\n  — collect public post, Reel, carousel, profile, and collaboration metrics.\n- [YouTube Metrics Scraper](https://apify.com/chronometrica/youtube-metrics-scraper)\n  — collect public video, Short, channel, and engagement metrics.\n- [Snapchat Spotlight Metrics Scraper](https://apify.com/chronometrica/snapchat-metrics-scraper)\n  — collect public Spotlight post views, engagement, creator, and media data.\n- [X Post Metrics Scraper](https://apify.com/chronometrica/x-post-metrics)\n  — collect public post views, engagement, media, and author details.\n"
    },
    "buildNumber": "0.1.36",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.059776666666666665
    }
  }
}