Instagram Competitor Monitor
Pricing
from $4.85 / 1,000 competitors
Instagram Competitor Monitor
Track Instagram competitor accounts and see what changed since your last run. One row per account: followers, following and posts now, the change since last time, and flags for bio and verified changes, with the exact time window. 15 accounts per run. $5.00 per 1,000 account checks.
Pricing
from $4.85 / 1,000 competitors
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
6 days ago
Last modified
Categories
Share
List the Instagram accounts you want to watch and see what changed on each since your last run: current follower, following and post counts, the change since last time, and a flag when the bio was edited or the blue tick came or went, with the exact window the comparison covers.
The first run on any handle has nothing to compare against, so it writes the baseline and every
delta comes back null with isFirstRun: true. Run it a second time and the numbers start meaning
something. That is not a limitation you can configure away, it is just how a before-and-after works. On the free Apify plan a run checks the first handle on your
list only, and a free row says so.
| Input | 1 to 20 Instagram handles, @handles or profile URLs |
| Output | One row per account: followers, following and posts now, the change since your last run, bio and verified changes, the window it covers |
| Ceiling | 15 accounts checked per run |
| Account needed | None |
| Price | $5.00 per 1,000 account checks ($0.005 each) on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 1,000 |
🔍 What Instagram Competitor Monitor does
Each run reads the public profile of every handle you gave it, compares it against the snapshot from your previous run, writes the row, and then stores the new snapshot for next time. The history lives in a key-value store on your Apify account, so your baselines are yours and nobody else's runs touch them.
Put it on a daily schedule and the rows become a time series. hoursSinceLastCheck and
previousCheckedAt sit on every row, so you always know what window a delta actually covers rather
than assuming it was 24 hours.
The same account written two ways in one list is checked once and billed once.
📋 What data you get from each Instagram account you watch
| What you get | Field |
|---|---|
| Handle, display name and profile link | username, fullName, profileUrl |
| Verified, private and business flags | isVerified, isPrivate, isBusiness |
| Followers, following and posts right now | followers, following, posts |
| The change in each since your last run | followersDelta, followingDelta, postsDelta |
| Whether the bio or the blue tick changed, and the current bio and link | biographyChanged, verifiedChanged, biography, externalUrl |
| The window the comparison covers | hoursSinceLastCheck, previousCheckedAt, checkedAt, isFirstRun |
▶️ How to scrape Instagram competitor accounts
- Open Instagram Competitor Monitor and click Try for free.
- Put the accounts you want to watch into Instagram accounts to monitor.
- Click Start. This first run writes the baseline, so the deltas will be empty.
- Run it again later, or put it on Apify's scheduler, and the second run onwards carries the changes.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
Start a run with nothing filled in and you get one labelled sample row showing what a second-run row looks like. That row is not charged.
💰 How much does it cost to scrape Instagram competitor accounts?
$0.005 per account checked on the Free plan, which is $5.00 per 1,000 checks, a little less on paid plans. On the free plan, the $5 Apify gives you each month covers about 1,000 checks, but a run on the free plan checks only the first handle on your list. On a paid plan a watch list of ten accounts checked daily runs about three months on the same $5.
One charge per account row, the baseline run included. The same handle listed twice in one run is billed once. Sample rows and diagnostic rows are not billed, so a dead handle or a run that stops early does not cost you results.
📥 What you give it
There is one field. That is the whole input.
{"competitors": ["nasa", "@natgeo", "https://www.instagram.com/nike/"]}
| Field | Default | What it is |
|---|---|---|
competitors | none | 1 to 20 entries. A bare handle, an @handle or a full profile link, mixed freely. Duplicates are collapsed. |
Post and reel links are not accounts. Paste one and you get an uncharged row saying so, and the rest of your list carries on.
📤 What you get back
A real row from a run on 21 September 2026, with one emoji cut out of the bio:
{"ok": true,"recordType": "competitor","username": "nasa","fullName": "NASA","isVerified": true,"isPrivate": false,"isBusiness": true,"profileUrl": "https://www.instagram.com/nasa/","followers": 104352676,"following": 91,"posts": 4928,"biography": "Making the seemingly impossible, possible. ...","externalUrl": "https://www.nasa.gov","followersDelta": 7,"followingDelta": 0,"postsDelta": 0,"biographyChanged": false,"verifiedChanged": false,"isFirstRun": false,"hoursSinceLastCheck": 0.02,"previousCheckedAt": "2026-09-21T01:32:55.336Z","checkedAt": "2026-09-21T01:34:02.684Z"}
That row came from a deliberate back-to-back test, which is why hoursSinceLastCheck is a minute
rather than a day. Seven followers in a minute is what a 104-million account does while you look
away.
| Field | How to read it |
|---|---|
followersDelta, followingDelta, postsDelta | Signed change since your previous run. Negative when the number went down. All null on a first run. |
biographyChanged, verifiedChanged | true when the text or the tick moved between the two runs. null on a first run. |
isFirstRun | true means this run wrote the baseline and there was nothing to compare against. |
hoursSinceLastCheck, previousCheckedAt | The window the deltas cover. Read these before trusting a delta. |
followers, following, posts | Current counts. On a private account these can be null rather than zero. Nothing is guessed. |
🧾 Reading the output
Three kinds of row land in your dataset, and only the first kind is billed.
| Row | How to spot it | Billed |
|---|---|---|
| An account check | charged: true, recordType: "competitor" | yes |
| The sample row | _sample: true, charged: false, and only on a run with no handles | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
Filter on charged == true and you have your checks; the sample row says
recordType: "competitor" too. Read charged as the marker of a real row rather than a receipt.
| Code | What it means |
|---|---|
BAD_INPUT | Not an account. A post link, or more than 20 entries in the list. |
NOT_FOUND | Instagram has no such account any more. |
FREE_PLAN_LIMIT | You are on the free Apify plan, so the run checked only the first handle. notChecked lists the rest. A paid plan gets the full run. |
PARTIAL | The run stopped before reaching that handle. What arrived is complete and correct. |
TIME_BUDGET | The run ran out of time before reaching that handle. Accounts it did not check keep their saved history, so the next run covers their whole window. The run ends as failed only when the time limit stopped it before any account was checked. |
STATE_UNAVAILABLE | The stored history could not be read, so that account was skipped this run. |
STATE_NOT_SAVED | The row was delivered but the new snapshot did not save, so the next run will compare against the older one. |
RATE_LIMITED | Too many runs too close together. Space them out. |
SERVER_ERROR, NETWORK, CHARGE_ERROR, UNEXPECTED_ERROR | Something that did not fit the list above. |
No diagnostic row is billed, and one bad handle does not stop the others.
💡 What people use it for
- A daily run over a shortlist of rivals, so a follower spike is visible the morning after rather than at the end of the quarter.
- Catching a bio or link-in-bio change, which is usually the first public sign of a launch.
- Watching when an account starts or stops posting, through
postsDelta. - Keeping an honest record of growth claims before a partnership conversation.
From a change to the post behind it, in three steps:
- Run this daily on your watch list.
- When a row shows
postsDeltaabove zero, run Instagram Scraper on thatusernamewithonlyPostsNewerThanset to1 day. - Put the new posts'
urlinto Instagram Comments Scraper to see how people reacted.
🚧 What it does not do
- The first run has no deltas. It writes the baseline. You need a second run.
- The box takes 20 handles, a run checks 15. Anything past that comes back as an uncharged
PARTIALrow rather than being quietly dropped. Split a longer watch list across runs. - Profile numbers only. No posts, no captions, no engagement, no follower lists.
- History is keyed by handle. If an account renames itself, it starts over as a new one.
- Two schedules on the same list will both report, each against its own last run, so the windows overlap and the deltas look wrong. Run one schedule per list.
- Deleting the key-value store resets every baseline you have built up.
- No alerting. It writes rows. Wiring a Slack message to a
followersDeltathreshold is your side. - It is not an official Instagram tool. Dami's Studio is independent and is not affiliated with or endorsed by Instagram or Meta, or by any other company named on this page.
🧭 Which Instagram scraper do you need?
| If you want | Use |
|---|---|
| What changed on a set of accounts since last time | This one |
| A full profile read in one go, with contacts and engagement | Instagram Profile Scraper |
| Their posts and reels | Instagram Scraper |
| Posts other people made about them | Instagram Mentions Scraper |
❓ Questions people ask
Do I need an Instagram account to monitor competitors?
No. Private accounts give you what Instagram shows a stranger, which for some means the counts come back empty.
Why are all my deltas empty?
Because it was the first run for those handles. isFirstRun says so on every row. Run it again and
you will get changes.
Where is the history kept?
In a named key-value store on your own Apify account, keyed by handle. It is yours, and it persists between runs.
How often should I schedule it?
Daily suits most watch lists. hoursSinceLastCheck tells you what each delta actually covers, so an
irregular schedule still gives usable numbers.
Can I watch 50 accounts?
Not in one run. A run checks 15, so split them into separate runs or schedules, one list each.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has
ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP
client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/instagram-competitor-monitor.
Either way the run happens on your Apify account at the same price, and the history lives there too.
Is scraping Instagram legal?
This reads public profiles only, never private accounts or messages. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the handles you used and the run ID. The code on the diagnostic row usually explains it on its own.