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.
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.
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.
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"])
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.
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.
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:
login_required for
/metrics calls on Instagram post URLs.content_unavailable.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