Track Competitor Instagram Reels Weekly With View Counts
Log every new reel your competitors post each week, with plays, likes and audio, using Instagram Reel Scraper on a weekly Apify schedule.
The actor referenced in this article. Pay only for results delivered.
Knowing what a competitor posted on Instagram last week, and which of those reels took off, is a standing Monday question for social and brand teams. Answering it by hand means opening each profile, scrolling the Reels tab, and copying play counts that keep moving while you type. With four or five competitors that is an hour a week, and the numbers are already stale by the time the spreadsheet is done.
Try it live: Instagram Reel Scraper: Views, Captions, Audio, No Login. Pay per result delivered. Failed and empty results are never charged.
The Instagram Reel Scraper reads each profile’s Reels tab as a logged out visitor and returns one row per reel with plays, likes, comments, caption, audio and exact post time. Point it at your competitors, limit it to the last eight days, run it every Monday, and keep a running file keyed on each reel’s shortCode.
What you get and who it is for
| Field | Why it matters for a weekly report |
|---|---|
shortCode | The code from the reel’s link, and your dedupe key from week to week |
videoPlayCount | Plays, as Instagram shows them on the Reels tab |
likesCount, commentsCount | Engagement at the moment of the run |
timestamp | Exact publish time in UTC, for posting cadence |
videoDuration | Length in seconds |
musicInfo | Original audio or a licensed song, with title and artist |
ownerUsername, coauthorProducers | Who posted the reel and who it was made with |
isPaidPartnership | Whether the reel carries Instagram’s paid partnership flag |
scrapedAt | When the counts were read |
This is built for social media managers who benchmark against a short list of direct competitors, agencies that send clients a weekly competitor digest, and brand strategists who want to see which formats, lengths and songs a category is leaning on. If the same competitors also post on X, their public posts can be pulled by handle without the API for the same weekly digest.
The input
{
"usernames": ["nike", "adidas", "puma", "newbalance"],
"maxReelsPerProfile": 50,
"newerThan": "8 days",
"skipPinned": true
}
newerThantakes a date such as2026-09-01or a period such as30 daysor2 weeks. Reading a profile stops at the first reel older than the window, so the reels behind it are never read or charged.- Why 8 days and not 7: the actor has no “only new reels” switch. A scheduled run can start a few minutes later than the one before it, and a 7 day window would then miss anything posted in that gap. An 8 day window overlaps last week’s run by a day, and the script below drops every
shortCodeit has already logged. maxReelsPerProfileis a ceiling from 10 to 300. Fifty leaves plenty of room for a busy account in eight days.skipPinnedis on by default. Pinned reels sit at the top of a profile whatever their age, so leaving them out keeps the list in date order.
What the output looks like
The same National Geographic reel, read by two of our runs:
[
{
"inputUrl": "natgeo",
"source": "profile",
"shortCode": "DeHRKQegTOR",
"url": "https://www.instagram.com/reel/DeHRKQegTOR/",
"caption": "Presented by @Rolex. Would you ever have guessed that flamingos are growing their own food with the help of fiddler crabs?...",
"videoPlayCount": 779781,
"likesCount": 25862,
"commentsCount": 99,
"videoDuration": 29.55,
"timestamp": "2026-10-05T13:02:25.000Z",
"ownerUsername": "natgeo",
"musicInfo": { "audioType": "original_sounds", "songTitle": "Original audio", "artistName": "natgeo" },
"coauthorProducers": [],
"isPaidPartnership": false,
"scrapedAt": "2026-10-05T18:02:24.426Z"
},
{
"inputUrl": "natgeo",
"shortCode": "DeHRKQegTOR",
"videoPlayCount": 1919445,
"likesCount": 53148,
"commentsCount": 157,
"timestamp": "2026-10-05T13:02:25.000Z",
"scrapedAt": "2026-10-07T11:11:27.588Z"
}
]
These rows come from two of our own runs that included natgeo, on October 5 and October 7, 2026, not from the brand list above. The reel went up at 13:02 UTC on October 5. Five hours after posting it had 779,781 plays; about 46 hours after posting it had 1,919,445, and likes had more than doubled. That is why the weekly file keeps scrapedAt next to every count: a reel posted the night before your run has had hours to collect plays, not days. On the October 7 run, 10 of the 12 reels read from nasa’s tab were posted by other accounts, such as astronauts, NFL teams and other NASA accounts, with nasa as a coauthor.
Run it in Apify Console
- Open https://apify.com/themineworks/instagram-reel-scraper and click Try for free.
- In Instagram profiles, replace the prefilled natgeo and nasa with your competitors’ usernames, one per line.
- Set Max reels per profile to 50 and Only reels newer than to 8 days. Leave Skip pinned reels on and Proxy as it is.
- Click Start. Rows appear in the Output tab.
- Click Export and download the dataset as CSV, JSON or Excel.
Run it from Python
Install the client with pip install apify-client, then run this script once a week. It keeps one CSV of every reel it has seen and prints a short summary of the new ones.
import csv
import os
from statistics import median
from apify_client import ApifyClient
COMPETITORS = ["nike", "adidas", "puma", "newbalance"]
HISTORY = "competitor_reels.csv"
FIELDS = ["shortCode", "url", "competitor", "ownerUsername", "timestamp",
"videoPlayCount", "likesCount", "commentsCount", "videoDuration",
"song", "isPaidPartnership", "scrapedAt"]
seen = set()
if os.path.exists(HISTORY):
with open(HISTORY, newline="", encoding="utf-8") as f:
seen = {row["shortCode"] for row in csv.DictReader(f)}
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("themineworks/instagram-reel-scraper").call(run_input={
"usernames": COMPETITORS,
"maxReelsPerProfile": 50,
"newerThan": "8 days",
"skipPinned": True,
})
new_rows = []
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("_type") == "info":
continue # the run summary row, never billed
if item["shortCode"] in seen:
continue # already logged last week, the 8 day window overlaps by a day
seen.add(item["shortCode"])
music = item.get("musicInfo") or {}
new_rows.append({
"shortCode": item["shortCode"],
"url": item["url"],
"competitor": item["inputUrl"],
"ownerUsername": item["ownerUsername"],
"timestamp": item["timestamp"],
"videoPlayCount": item.get("videoPlayCount"),
"likesCount": item.get("likesCount"),
"commentsCount": item.get("commentsCount"),
"videoDuration": item.get("videoDuration"),
"song": music.get("songTitle", ""),
"isPaidPartnership": item.get("isPaidPartnership", False),
"scrapedAt": item["scrapedAt"],
})
write_header = not os.path.exists(HISTORY)
with open(HISTORY, "a", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=FIELDS)
if write_header:
writer.writeheader()
writer.writerows(new_rows)
for name in COMPETITORS:
rows = [r for r in new_rows if r["competitor"] == name and r["videoPlayCount"]]
if not rows:
print(f"{name}: no new reels")
continue
top = max(rows, key=lambda r: r["videoPlayCount"])
plays = median(r["videoPlayCount"] for r in rows)
print(f"{name}: {len(rows)} new reels, median plays {plays:,.0f}, "
f"top {top['url']} with {top['videoPlayCount']:,}")
The first run writes the header and every reel. Each later run appends only the shortCodes the file has not seen, so the overlap day never doubles a row.
Run it every week
In Apify Console, save the input above as a task, open Schedules, create a schedule with the cron expression 0 7 * * 1 (every Monday at 07:00) and add the task to it. The actor’s schema has no “only new” option, so the newerThan window plus the shortCode check in your script is what keeps each week to new reels.
For the destination, Apify’s Google Sheets integration can send each run’s dataset to a sheet, Make, Zapier or n8n can post a digest to a Slack channel when the run finishes, and a webhook can call your own endpoint on success. If you care more about settled numbers than about new arrivals, widen newerThan to 14 days and overwrite the stored counts for known shortCodes instead of skipping them. Every reel then gets a second reading at one to two weeks old, at roughly twice the reels per run.
What it costs
The price is $1.69 per 1,000 reels on the Bronze plan, $1.39 on Silver, and $0.99 on Gold, Platinum and Diamond, plus a flat $0.005 run start fee per run. Private accounts, usernames that do not exist and the info row are never charged.
natgeo’s Reels tab held 11 reels from the seven days before our October 6 morning run. Four competitors at that pace, read with an 8 day window, comes to about 50 reels per run and 200 a month over four Mondays: about $0.34 on Bronze, $0.28 on Silver and $0.20 on Gold, plus $0.02 in start fees.
Limits worth knowing
- Profiles and reel links only. Hashtag and keyword search on Instagram needs a login, which this actor never uses.
- You get comment counts, not comment text.
- Counts are live as of
scrapedAtand nothing is cached between runs. ThevideoUrlanddisplayUrllinks are signed by Instagram and expire after a few days, so download any media you want to keep soon after the run. - Private accounts and usernames that do not exist return no rows. They are listed with a status in the run’s
OUTPUTrecord and not charged. - Up to 500 profiles and up to 300 reels per profile in one run.
Related
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
Frequently asked questions
Does the reel scraper have an option to return only new reels? +
No. Set newerThan to a window slightly longer than your schedule, such as 8 days for a weekly run, and skip any shortCode you already logged. Reading stops at the first reel older than the window, so older reels are never charged.
Why do some rows in a competitor's results belong to other accounts? +
Those are collab reels. Instagram shows a collab on the Reels tab of every coauthor, so ownerUsername is the account that posted it and coauthorProducers lists the partners. Filter on ownerUsername if you only want reels the competitor posted.
Are the play counts in a weekly report final? +
No. Each run reads Instagram live, so counts are as of scrapedAt. A reel posted the evening before your run has had hours to collect plays, so compare reels of a similar age or take a second reading the following week.
Do I need an Instagram login or my own proxy? +
No. The actor reads public profiles as a logged out visitor over Apify datacenter proxy, which is included in the price.
Export a Creator's Instagram Reels With Play Counts to a Spreadsheet
Export one creator's reels with plays, likes, comments, length and audio to a CSV, then compute median plays to vet them, with Instagram Reel Scraper.
Find Paid Partnership Posts on Any Instagram Profile
List the paid partnership and branded posts on any public Instagram profile, and the brands behind them, using Instagram Post Scraper and Python.
Monitor Competitor LinkedIn Company Posts on a Schedule
Get every new post from competitor LinkedIn company pages each day or week, with only-new mode and an Apify schedule. No LinkedIn login or cookies.
Benchmark LinkedIn Post Engagement Across Company Pages
Compare reactions and comments per post across LinkedIn company pages, scaled by follower count, with the LinkedIn Company Posts Scraper. No login.