Instagram, Facebook, Threads & YouTube Post Metrics
Pricing
from $3.00 / 1,000 post metrics extracteds
Instagram, Facebook, Threads & YouTube Post Metrics
Get likes, comments, shares, views and followers from Instagram, Facebook, Threads and YouTube post URLs in one table, with the same columns for every platform. Hidden counts are null, never a made-up zero. Export to CSV, Excel or JSON, schedule runs or call the API.
Pricing
from $3.00 / 1,000 post metrics extracteds
Rating
0.0
(0)
Developer
CHEN-SHU-CHEN
Maintained by CommunityActor stats
0
Bookmarked
19
Total users
16
Monthly active users
3 days ago
Last modified
Categories
Share
You ran a campaign across Instagram, Facebook, Threads, TikTok and YouTube. Now you need one report, and the tools you would normally reach for cover one platform each.
Paste the post URLs, all five platforms mixed together, and get back a single table of likes, comments, shares, views and follower counts with the same columns for every row. Export it as CSV, Excel or JSON, call it through the Apify API, or put it on a schedule.
TikTok support starts on November 1, 2026, when its price takes effect. Until then, TikTok URLs come back as not_processed and are not charged. YouTube works now.
Built for checking posts you already know about: campaign reporting, influencer delivery checks, monthly performance decks. If instead you need to find posts by hashtag, keyword or account, use a platform-specific scraper; this one takes URLs and nothing else.
Why one Actor instead of five
Running a separate scraper per platform leaves you joining five tables with five different sets of column names before you can add anything up. This returns likeCount, replyCount, shareCount and viewCount under the same names whether the URL was Instagram, Facebook, Threads, TikTok or YouTube.
Two more things matter once you start computing on the numbers:
Unknown is null, never 0. A post whose author hid its like count reports likeCount: null. Instagram's own embed returns 0 for those posts and its post page returns a different number again — both are fabrications. Summing a fabricated 0 silently understates your total, so this Actor refuses to emit one.
Failed URLs still appear. A deleted post comes back as a row with status: "not_found" and null metrics, not as a row that quietly vanishes. 100 URLs in, 100 rows out. A missing row is invisible; a marked row is something you can account for.
How to get Instagram, Facebook, Threads, TikTok and YouTube post metrics
- Open the Input tab and paste your post URLs into Post URLs, one per line. Platforms can be mixed in any order.
- Leave the proxy settings as they are unless you know you need something else. Instagram, Threads and YouTube use datacenter proxies; Facebook and TikTok use residential.
- Click Start. Each URL usually takes a few seconds.
- Open the Output tab and export the table as CSV, Excel or JSON, or read it from the dataset through the API.
- To refresh the numbers every week, save the input as a task and add it to a schedule. To fill a Google Sheet, see
examples/google-apps-script.gsin the source repository.
How much does it cost to get post metrics?
This Actor is priced per post, so you pay for what you read and nothing for time spent waiting on a platform.
| Event | Price | Per 1,000 |
|---|---|---|
Instagram, Threads or YouTube post read (post-extracted) | $0.003 | $3 |
Facebook post read (post-extracted-facebook) | $0.006 | $6 |
TikTok post read (post-extracted-tiktok), from November 1, 2026 | $0.005 | $5 |
Post deleted or not readable (post-unavailable) | $0.0005 | $0.50 |
Run start (apify-actor-start, per GB of memory) | $0.001 | — |
Runs default to 4 GB of memory, so the run start costs $0.004. The Actor needs far less: choose 1 GB to pay $0.001 per run instead, at roughly half the speed. Anything from 512 MB to 4 GB is allowed.
URLs that are not on any of the five platforms at all (unsupported_url), and URLs that were never read (not_processed: the run stopped early, or the proxy that platform needs could not be set up), are free. A link on one of those sites that is not a post, such as a profile page, is still attempted, and is charged as post-unavailable when no post can be read from it.
Why do Facebook and TikTok cost more?
They are the two platforms that need residential proxies, which are paid by the gigabyte, and Facebook's video pages are several times the size of a photo page. A separate price for each keeps Instagram, Threads and YouTube from paying for them.
How do I cap what a run can spend?
Set a maximum cost per run in the run options. Before reading each URL the Actor checks that the limit can still pay for it, and stops when it cannot; every URL it did not get to still appears in the output as not_processed. If a charge fails, the run stops the same way instead of working on unpaid. A failed charge is not sent a second time: the Apify client has already retried it under one idempotency key, and a fresh attempt could charge the same post twice.
Input
| Field | Description |
|---|---|
postUrls | Post URLs. Platforms can be mixed freely in one run. |
fetchFollowers | Look up each author's follower count. Costs one extra request per account. |
abortAfterConsecutiveFailures | Stops the run when a platform stops responding, so a broken run cannot burn through a long list. Deleted posts do not count toward this. |
proxyConfiguration | For Instagram, Threads and YouTube. Datacenter proxies are enough. |
facebookProxyConfiguration | For Facebook only, which needs residential proxies — see below. |
tiktokProxyConfiguration | For TikTok only. Defaults to residential. Not used at all by a run without TikTok URLs. |
Accepted URL shapes:
- Instagram —
/p/{code}/,/reel/{code}/ - Threads —
threads.com/@user/post/{code}andthreads.netequivalents - Facebook —
{pageId}_{postId},permalink.php,/posts/pfbid…,/reel/{id},/videos/{id},/photo/?fbid= - TikTok —
tiktok.com/@user/video/{id},/@user/photo/{id},m.tiktok.comlinks, andvm.tiktok.com/vt.tiktok.com/tiktok.com/t/share links, which are followed to the post - YouTube —
watch?v={id},youtu.be/{id},/shorts/{id},/live/{id}, and them.andmusic.equivalents. Every shape is read from the regular watch page, because the Shorts page leaves out the view count and the subscriber line.
Example input:
{"postUrls": ["https://www.instagram.com/p/DcMXl1IPNtB/","https://www.threads.com/@zuck/post/Db2wI-DilLt","https://www.facebook.com/NASA/posts/2081961582409340"],"fetchFollowers": true}
Output
One row per input URL:
| Field | Notes |
|---|---|
status | success, not_found, login_required, post_not_loaded, parse_failed, unsupported_url, not_processed |
platform | Instagram, Facebook, Threads, TikTok or YouTube |
postUrl, username, authorUrl | |
mediaType | image, video, carousel, text; on YouTube short (a Short), live (a stream that is live now) or video (everything else, including recordings of past streams) |
likeCount | Reactions on Facebook |
replyCount | Comments |
shareCount | Facebook and TikTok shares; reposts plus quotes on Threads. Instagram and YouTube do not expose shares. |
repostCount, quoteCount | Threads only, kept separate as well |
viewCount | Instagram and Facebook: video and reel plays; image and carousel posts have none. Threads: the post's view count, which Threads shows on text and image posts too. TikTok: plays. YouTube: total views — on a stream that is live now, total views rather than the "watching now" figure. |
followerCount | Exact on Threads. On Instagram and Facebook it is exact when the page carries the number as data, and falls back to the displayed figure (rounded above ~10K, e.g. 2.8M → 2800000) when it does not. null when the author's profile could not be read |
createdAt | ISO 8601, UTC |
text, hashtags, mentions | Hashtags and mentions are parsed from the caption. On YouTube the caption is the title followed by the description. |
saveCount | TikTok only: saves. Exact at any size. Present on TikTok and YouTube rows only (always null on YouTube). |
durationSeconds | TikTok and YouTube only: video length. null on TikTok photo posts and on a stream that is still live. |
Instagram, Facebook and Threads rows carry exactly the fields they always have; saveCount and durationSeconds appear only on TikTok and YouTube rows.
Example row (caption shortened):
{"platform": "Threads","status": "success","postUrl": "https://www.threads.com/@zuck/post/Db2wI-DilLt","username": "zuck","authorUrl": "https://www.threads.com/@zuck","mediaType": "text","text": "Today we're also opening the weights for Muse Glimmer…","hashtags": [],"mentions": ["alexanddeer"],"createdAt": "2026-08-10T10:01:59.000Z","likeCount": 1971,"replyCount": 477,"shareCount": 133,"repostCount": 88,"quoteCount": 45,"viewCount": 323526,"followerCount": 5752077}
URLs that could not be read are also listed in FAILED_URLS in the run's key-value store, with the reason. It is always written, as an empty list when every URL was read.
What each failure status means:
not_found— the platform said the post is gone: deleted, or a link to a post that never existed.login_required— the platform showed a login wall instead of the post.post_not_loaded— the page answered without the post in it, for example a rate-limit or challenge page, a TikTok share link that was throttled before it resolved, a page about a different post than the one asked for, or a request that never got an answer. The post may well still exist; try it again later.not_processed— the URL was never read: the run stopped early, or the proxy its platform needs could not be set up. Free.parse_failed— the page loaded but its data was not in a shape the Actor recognises.
Credentials pasted inside a link, such as an access_token or api_key query or fragment parameter or a user:password@ before the host (with or without https://), are removed from postUrl, the log and FAILED_URLS, including links quoted inside error messages. Every other part of the link is kept exactly as given.
TikTok and YouTube: which numbers are rounded, and why
Both platforms publish some figures only in rounded form, to everyone who is not the account owner. This Actor passes those figures on exactly as the platform shows them: a rounded number is what TikTok or YouTube itself reports, not an estimate added here, and leaving it out would leave you with nothing to add up.
- TikTok: plays, likes, comments and shares are exact below 10,000 and rounded to one decimal of K, M or B from 10,000 up —
31.2Mlikes arrive as31200000. TikTok's public pages and web API have rounded these since at least 2022 (TikTok-Api maintainer, 2023: "TikTok's API response is unfortunately rounded"), and other TikTok scrapers return the same rounded values. Saves (saveCount) are exact at any size. - TikTok: followers. With
fetchFollowerson, the Actor reads the author's profile, which carries a more precise figure than the post page, once per account. If the profile cannot be read, the post page's rounded figure is used instead. - YouTube: views and likes are exact. Comments are exact below one million and rounded from there (
2.4Marrives as2400000) — YouTube abbreviates them on its public pages in every language. Comments turned off, and a live stream's chat, givenull. - YouTube: subscribers (
followerCount) are rounded to three significant figures. That is YouTube's own policy since 2019 and applies to its official Data API too (YouTube Data API: "rounded down to three significant figures"); only the channel owner sees the exact count.
A rounded figure is within half of its last shown digit: 31.2M means somewhere around 31,150,000 to 31,250,000, so a TikTok post with millions of likes can be off by up to about 50,000. Posts under 10,000 are exact.
Facebook needs residential proxies
Facebook serves a login wall to datacenter IP ranges. Measured on this platform: 0 of 4 posts readable through datacenter proxies, 3 of 4 through residential, where the fourth was a page that really had been removed.
Instagram, Threads and YouTube have no such restriction, which is why they get their own proxy setting. Leaving them on datacenter keeps a mixed run cheap — paying residential rates for every platform would cost roughly forty times more for the ones that do not need it. TikTok gets its own setting for the opposite reason: it is known to be strict with datacenter IPs, so it defaults to residential.
YouTube shares the Instagram and Threads setting but always reads through Apify's datacenter proxy: if proxyConfiguration is set to a residential (or other per-gigabyte) group, Instagram and Threads use it and YouTube does not, because a YouTube page at residential rates would cost more than the post's price. YouTube sometimes answers a datacenter IP with a bot check or a rate limit; each such post is retried twice over a new connection, which gets a different IP, before it is reported as login_required or post_not_loaded.
What it cannot return
- Reach and impressions. Visible only to a page's own administrators. No public scraper can produce these; anything claiming otherwise is estimating.
- Private accounts, and posts behind a login.
- Comment text, follower lists, hashtag search, account crawling. This Actor reads posts you name; it does not discover them.
- Paid-partnership labels. The field exists in Meta's data but is empty for logged-out requests.
- Exact TikTok counts above 10,000, exact YouTube subscriber counts, and YouTube shares or saves. The platforms do not publish them; see above.
Other Actors for social media reporting
| Actor | Use it when |
|---|---|
| Instagram, Facebook & Threads Post Metrics Tracker | You want the same posts re-read on a schedule, with the change since the last run and since the first. |
| Instagram Engagement Rate Calculator & Audit | You are choosing creators and want followers, median engagement and posting frequency per account, not per post. |
FAQ
Why is a number null instead of 0?
Because the platform did not show it. A hidden like count, an image with no views, or Instagram's missing share count are unknown, not zero. Treat null as "not available" when you add things up.
Why did a Facebook URL come back as login_required?
Facebook showed a login wall instead of the post. Make sure Proxy for Facebook is set to residential. If it already is, the post may be restricted to logged-in viewers.
Some Threads rows come back with followerCount: null. Why?
Some accounts, many news outlets among them, put their Threads profile behind a login. The post itself is still read, so the row is success with every post metric, but the follower count lives on the profile, and the Actor returns null there rather than a guess. A post that is itself behind the login wall returns login_required.
Is the follower count exact?
On Threads, yes. On Instagram and Facebook it is exact whenever the page carries it as data, which covers most posts. When it does not, as on many Instagram single-image posts, the Actor falls back to the figure the page displays, which the platform rounds above ~10K. On TikTok it comes from the author's profile, falling back to the post page's rounded figure. On YouTube it is the subscriber count, which YouTube rounds for everyone but the channel owner.
What happens when a platform changes its pages?
Extraction depends on undocumented internal JSON, which Meta, TikTok and YouTube can change without notice. Failures are reported per URL rather than crashing the run, and the run stops early after several failures in a row so a broken platform does not use up your budget. Report it in the Issues tab; set debugSaveHtml to keep the raw responses for diagnosis. Session tokens Meta embeds in those pages are blanked out before they are stored.
What happens if the platform restarts my run?
Apify sometimes moves a running Actor to another server. The Actor saves its position after every URL and carries on from there, so finished URLs are neither read nor output again. Two narrow gaps remain, each for at most one URL per restart:
- a restart in the instant between a row being written and the position being saved outputs that row a second time;
- a restart in the instant between a charge going through and the Actor recording it charges that post a second time.