Instagram Scraper API guides

Track Instagram Reel Views Over Time: Build a Reels Views Tracker

Instagram shows a reel's lifetime play count and no history. Snapshot a creator's reels on a schedule, store each reading, and you get the thing Instagram won't give you: views per hour, and a breakout reel flagged while it's still climbing.

A reel's view count is a single number that only goes up. Instagram never shows you when those views arrived, so "this reel is taking off" is invisible until it's over. The fix is to take your own readings: call /v1/profile/reels on a schedule, keep every snapshot, and the trend is the difference between consecutive rows.

Try it free in your browser, no key needed →
Paste a URL, see the result as a table and export it. Come back here for the code when you want it automated.

Get your API key on RapidAPI

Why one request isn't tracking

One call tells you a reel has 480,000 views. It cannot tell you whether that happened yesterday or over six months - and those two reels deserve completely different decisions. No API can backfill it, because Instagram doesn't store or expose the history. Your first run is a baseline; the second run is the first real data point.

1. Snapshot the Reels tab on a schedule

One GET with the profile URL, @handle or bare username and a count of up to 1,000. Write every reel into a table keyed by (url, checked_at) so readings accumulate instead of overwriting each other. Hourly is the right cadence: identical requests are served from cache for an hour, so polling faster costs quota and returns the same numbers.

2. Diff consecutive snapshots

Views gained is the latest reading minus the one before it, and dividing by the hours between them gives a rate that's comparable across reels of different ages. That rate is the metric worth watching - raw totals just rank the oldest reels first.

3. Flag the breakout

A reel is breaking out when its current views-per-hour is well above its own recent rate - not when its total is high. Compare each reel's latest rate to the creator's median rate and alert on anything a few multiples above it. That's your cue to boost it, reuse the hook, or brief the creator again.

Tips

Full example (Python)

# Get an API key: https://rapidapi.com/goodstobkal-goodstobkal-default/api/instagram-scraper57
HOST = "YOUR-API-HOST.p.rapidapi.com"
HEADERS = {"x-rapidapi-key": "YOUR_RAPIDAPI_KEY", "x-rapidapi-host": HOST}
BASE = f"https://{HOST}"

# Run this hourly (cron, Task Scheduler, GitHub Actions). The first run saves a
# baseline and prints nothing; every run after prints what moved.
import sqlite3
import statistics
import time

import requests

USERNAME = "nasa"
COUNT = 50

db = sqlite3.connect("reels.db")
db.execute("""CREATE TABLE IF NOT EXISTS snapshots (
    url TEXT, checked_at INTEGER, view_count INTEGER, like_count INTEGER,
    caption TEXT, PRIMARY KEY (url, checked_at))""")

reels = requests.get(
    f"{BASE}/v1/profile/reels",
    params={"channel_url": USERNAME, "count": COUNT},
    headers=HEADERS,
    timeout=330,
).json()["posts"]

now = int(time.time())
db.executemany(
    "INSERT OR REPLACE INTO snapshots VALUES (?, ?, ?, ?, ?)",
    [(r["url"], now, r["view_count"] or 0, r["like_count"] or 0, (r.get("caption") or "")[:70])
     for r in reels],
)
db.commit()

# Each reel's two most recent readings, and the rate between them.
moved = db.execute("""
    WITH ranked AS (
        SELECT url, checked_at, view_count, caption,
               ROW_NUMBER() OVER (PARTITION BY url ORDER BY checked_at DESC) AS rn
          FROM snapshots)
    SELECT new.caption,
           new.view_count,
           new.view_count - old.view_count            AS gained,
           (new.checked_at - old.checked_at) / 3600.0 AS hours
      FROM ranked new JOIN ranked old ON new.url = old.url
     WHERE new.rn = 1 AND old.rn = 2 AND new.checked_at > old.checked_at
""").fetchall()

if not moved:
    raise SystemExit(f"Baseline saved for {len(reels)} reels - run again in an hour.")

rates = [(caption, views, gained, gained / hours) for caption, views, gained, hours in moved]
median = statistics.median([r for *_, r in rates]) or 1

for caption, views, gained, rate in sorted(rates, key=lambda r: r[3], reverse=True)[:10]:
    flag = "  <-- BREAKOUT" if rate > median * 3 else ""
    print(f"{rate:>9,.0f}/h  +{gained:<9,}  {views:>12,} total  {caption}{flag}")

Replace YOUR-API-HOST and YOUR_RAPIDAPI_KEY with the values from the listing's Endpoints tab on RapidAPI.

Frequently asked questions

Can I see historical view counts for an Instagram reel?

Not from Instagram - it exposes only the current lifetime play count, with no history and no per-day breakdown, and neither does any API. History exists only if you record it yourself. The tracker below starts building it on its first run.

How often should I poll for new view counts?

Hourly. Identical requests are cached for an hour, so polling more often returns the same numbers and spends quota for nothing. Hourly readings are granular enough to catch a reel taking off the same day.

Can I get view counts for Instagram Reels via API?

Yes. Every reel returned by /v1/profile/reels includes view_count (Instagram's play count) alongside like and comment counts, for any public account - not just your own.

Does this work for competitors' accounts?

Yes. It reads public data, so you can track any public creator or brand. They are not notified and you need no relationship with the account.

Do I need an Instagram account or login?

No. You call the API with your RapidAPI key - no Instagram account, cookie or browser automation on your side.

More guides