Instagram Competitor Monitor
Track up to 20 Instagram accounts. Each row shows what changed since the last run. Followers, posts, bio, verification, and the exact window.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
competitors(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.005 per competitor checked = $5 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Competitor checked | Charged once per competitor account checked and delivered as a row. Sample rows, unresolvable accounts, provider stops and every diagnostic are never charged. | $0.005 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-19, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
competitors | The accounts to watch, 1 to 20 per run. A bare handle (nasa), an @handle (@nasa) or a full profile link (https://www.instagram.com/nasa/) all work, and the same account written two ways is checked and charged only once. Leave this empty and the run returns a single free sample row instead. Post and reel links are not accounts and are reported back to you, uncharged. | array |
What you get
A structured dataset — each result includes fields like:
usernamefullNameisVerifiedfollowersfollowersDeltafollowingfollowingDeltapostspostsDeltabiographyChangedverifiedChangedisFirstRunhoursSinceLastCheckcheckedAtExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Instagram Competitor Monitor: what changed on a rival account since your last run
List the Instagram accounts you want to watch and get one row per account back, with the current follower, following and post counts and the change since the last time you ran it. Bio edits and a gained or lost blue tick are flagged too, 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.
| Input | 1 to 20 Instagram handles, @handles or profile URLs |
| Output | One row per account, with the change since last time |
| Ceiling | 15 accounts checked per run |
| Account needed | None from you |
| Price | $0.005 per account checked, flat on every plan |
🔍 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.
Nothing to log into. The same account written two ways in one list is checked once and billed once.
📥 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.
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.
📤 What you get back
A real row from a real run, 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 | What it is |
|---|---|
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. |
biography, externalUrl | The current values, so you can see what a flagged change actually says. |
followers, following, posts | Current counts. On a private account these can be null rather than zero. |
Nothing is guessed. A field Instagram did not send comes back null.
🧾 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 | recordType: "competitor" | yes |
| The sample row | _sample: true, and only on a run with no handles | no |
| A diagnostic | ok: false and a code | no |
Rows also carry a charged flag. It labels real rows against samples and diagnostics rather than being a receipt, so count your competitor rows if you want to check the bill.
| 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. |
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. |
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.
▶️ How to run it
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.
💰 How much does it cost?
$0.005 per account checked, which works out at $5.00 per 1,000 checks. Flat on every Apify plan, no volume tiers.
One charge per account row. 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 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.
🚧 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.
- Private accounts give you what Instagram gives a stranger, which can mean
nullcounts. - No alerting. It writes rows. Wiring a Slack message to a
followersDeltathreshold is your
side.
🧭 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 | Instagram Profile Scraper |
| Who follows an account | Instagram Followers & Following Scraper |
| Their posts and reels | Instagram Scraper |
| Posts other people made about them | Instagram Mentions Scraper |
❓ Questions people ask
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. Split them into separate runs or schedules.
Does it work on private accounts? Partly. You get whatever Instagram shows a stranger, which for some private accounts means the counts come back empty.
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.