Instagram Competitor Monitor avatar

Instagram Competitor Monitor

Pricing

from $4.85 / 1,000 competitors

Go to Apify Store
Instagram Competitor Monitor

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

6 days ago

Last modified

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.

Input1 to 20 Instagram handles, @handles or profile URLs
OutputOne row per account: followers, following and posts now, the change since your last run, bio and verified changes, the window it covers
Ceiling15 accounts checked per run
Account neededNone
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 getField
Handle, display name and profile linkusername, fullName, profileUrl
Verified, private and business flagsisVerified, isPrivate, isBusiness
Followers, following and posts right nowfollowers, following, posts
The change in each since your last runfollowersDelta, followingDelta, postsDelta
Whether the bio or the blue tick changed, and the current bio and linkbiographyChanged, verifiedChanged, biography, externalUrl
The window the comparison covershoursSinceLastCheck, previousCheckedAt, checkedAt, isFirstRun

▶️ How to scrape Instagram competitor accounts

  1. Open Instagram Competitor Monitor and click Try for free.
  2. Put the accounts you want to watch into Instagram accounts to monitor.
  3. Click Start. This first run writes the baseline, so the deltas will be empty.
  4. Run it again later, or put it on Apify's scheduler, and the second run onwards carries the changes.
  5. 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/"]
}
FieldDefaultWhat it is
competitorsnone1 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.

FieldHow to read it
followersDelta, followingDelta, postsDeltaSigned change since your previous run. Negative when the number went down. All null on a first run.
biographyChanged, verifiedChangedtrue when the text or the tick moved between the two runs. null on a first run.
isFirstRuntrue means this run wrote the baseline and there was nothing to compare against.
hoursSinceLastCheck, previousCheckedAtThe window the deltas cover. Read these before trusting a delta.
followers, following, postsCurrent 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.

RowHow to spot itBilled
An account checkcharged: true, recordType: "competitor"yes
The sample row_sample: true, charged: false, and only on a run with no handlesno
A diagnostic_diagnostic: true and an errorCodeno

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.

CodeWhat it means
BAD_INPUTNot an account. A post link, or more than 20 entries in the list.
NOT_FOUNDInstagram has no such account any more.
FREE_PLAN_LIMITYou 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.
PARTIALThe run stopped before reaching that handle. What arrived is complete and correct.
TIME_BUDGETThe 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_UNAVAILABLEThe stored history could not be read, so that account was skipped this run.
STATE_NOT_SAVEDThe row was delivered but the new snapshot did not save, so the next run will compare against the older one.
RATE_LIMITEDToo many runs too close together. Space them out.
SERVER_ERROR, NETWORK, CHARGE_ERROR, UNEXPECTED_ERRORSomething 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:

  1. Run this daily on your watch list.
  2. When a row shows postsDelta above zero, run Instagram Scraper on that username with onlyPostsNewerThan set to 1 day.
  3. Put the new posts' url into 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 PARTIAL row 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 followersDelta threshold 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 wantUse
What changed on a set of accounts since last timeThis one
A full profile read in one go, with contacts and engagementInstagram Profile Scraper
Their posts and reelsInstagram Scraper
Posts other people made about themInstagram 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.

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.