The Mine Works
← All posts
tutorial October 8, 2026 · 8 min read Updated October 8, 2026

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.

Try the scraper

The actor referenced in this article. Pay only for results delivered.

View the scraper →

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

FieldWhy it matters for a weekly report
shortCodeThe code from the reel’s link, and your dedupe key from week to week
videoPlayCountPlays, as Instagram shows them on the Reels tab
likesCount, commentsCountEngagement at the moment of the run
timestampExact publish time in UTC, for posting cadence
videoDurationLength in seconds
musicInfoOriginal audio or a licensed song, with title and artist
ownerUsername, coauthorProducersWho posted the reel and who it was made with
isPaidPartnershipWhether the reel carries Instagram’s paid partnership flag
scrapedAtWhen 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
}
  • newerThan takes a date such as 2026-09-01 or a period such as 30 days or 2 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 shortCode it has already logged.
  • maxReelsPerProfile is a ceiling from 10 to 300. Fifty leaves plenty of room for a busy account in eight days.
  • skipPinned is 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

  1. Open https://apify.com/themineworks/instagram-reel-scraper and click Try for free.
  2. In Instagram profiles, replace the prefilled natgeo and nasa with your competitors’ usernames, one per line.
  3. 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.
  4. Click Start. Rows appear in the Output tab.
  5. 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 scrapedAt and nothing is cached between runs. The videoUrl and displayUrl links 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 OUTPUT record and not charged.
  • Up to 500 profiles and up to 300 reels per profile in one run.
Related Actor

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.

Apify Store

Find a ready-made scraper for your job

Apify has over 80,000 scrapers and automations, ours included. Start free with $5 of platform credit every month.