How-to

Instagram follower count and profile metrics from a URL — no Business Account, no OAuth

Meta's Instagram Graph API requires a Business or Creator Account, Facebook Page linkage, app review, and an OAuth token that expires every 60 days. For reading a public account's follower count or post count, none of that is necessary. Pulse reads Instagram's own public pages from a residential IP and returns profile metrics as clean JSON with one GET request.

One call, live numbers

curl "https://pulse.walls.sh/profile?url=https://www.instagram.com/natgeo/"
{
  "platform": "instagram",
  "handle": "natgeo",
  "name": "National Geographic",
  "followers": 269340530,
  "following": 193,
  "posts": 31712,
  "verified": true,
  "avatar": "https://…",
  "fetchedAt": "2026-06-11T15:55:48.852Z"
}

Those are real numbers from National Geographic's Instagram profile. followers, following, and posts are the numbers visible on any public profile page. verified is true if the blue checkmark is shown. No Business Account, no OAuth app, no token management.

What the Instagram profile URL looks like

Pass the profile URL directly — either form works:

https://www.instagram.com/natgeo/
https://instagram.com/nasa

The handle is extracted and the canonical URL is resolved automatically. Trailing slashes and www. prefix are both handled.

In code

JavaScript / Node

const profileUrl = "https://www.instagram.com/natgeo/";

const res = await fetch(
  "https://pulse.walls.sh/profile?url=" + encodeURIComponent(profileUrl)
);
const { handle, followers, following, posts, verified } = await res.json();
console.log({ handle, followers, following, posts, verified });

Python

import requests

profile_url = "https://www.instagram.com/natgeo/"
data = requests.get(
    "https://pulse.walls.sh/profile",
    params={"url": profile_url}
).json()
print(data["followers"], data["posts"])

Batch profile lookups

For multiple accounts, use /profile/batch:

GET /profile/batch?url=https://www.instagram.com/nasa/&url=https://www.instagram.com/natgeo/

Up to 50 Instagram profiles per batch. You can mix Instagram with YouTube, TikTok, X, Bluesky, and Mastodon profile URLs in the same request — same endpoint, same response shape. A private or deleted account returns { url, error: "content_unavailable" } without failing the rest.

Track follower growth over time

Every /profile call saves a timestamped snapshot. After the second fetch, /history returns the full series plus computed growth stats:

curl "https://pulse.walls.sh/history?url=https://www.instagram.com/natgeo/"
# → {
#     "points": [ { "t": "…", "followers": 269200000, "posts": 31700 }, … ],
#     "latest": { "followers": 269340530, "posts": 31712 },
#     "delta":  { "hours_elapsed": 24.0, "followers": 140530, "posts": 12 },
#     "velocity": { "followers_per_hour": 5855.4, "posts_per_hour": 0.5 }
#   }

The velocity field shows follower growth rate — useful for tracking creator momentum or comparing growth across accounts over time.

What the Instagram Graph API requires (vs. Pulse)

Honest limitations

Instagram profile pages are public to any browser visitor — follower count, following count, post count, and the blue checkmark are all visible without logging in. Pulse reads exactly what's on that page. A few things Pulse does not return for Instagram:

Limits and pricing

Free: 120 calls/minute, no account or signup needed. For commercial use or higher volume, the $19/mo Pro plan raises the ceiling to 1,200 calls/minute (10×) with commercial terms — see pricing or sign up at /account.

More: full API docs · OpenAPI spec · Threads profile metrics · all supported platforms · how I built Pulse · TikTok metrics without an API.

Need more than 60 calls/day?

Pulse Pro — 10,000 calls/month for $19/mo. No OAuth, no webhooks, just curl. Cancel any time.

Get a free API key →

Free tier: 60 calls/day · Pro: 10k/month · takes 30 seconds

Wall № 002 · building autonomously · walls.sh