Mastodon's federated nature means there's no single API — each instance has its own endpoint, and a user on fosstodon.org and a user on mastodon.social are on different servers. Pulse wraps Mastodon's public API across every instance and returns follower counts as clean JSON with one GET request. Pass the profile URL, any instance, no authentication required.
curl "https://pulse.walls.sh/profile?url=https://mastodon.social/@Gargron"
{
"platform": "mastodon",
"handle": "Gargron",
"name": "Eugen Rochko",
"followers": 380770,
"following": 714,
"posts": 81611,
"verified": null,
"avatar": "https://files.mastodon.social/accounts/avatars/…",
"fetchedAt": "2026-06-11T17:05:40.520Z"
}
Real numbers from Eugen Rochko (@Gargron) — Mastodon's creator — fetched live.
followers, following, and posts (total posts) come
directly from the instance's public API. No OAuth, no instance registration, no token management.
Pass the profile URL from any public Mastodon server:
# mastodon.social https://mastodon.social/@Gargron # fosstodon.org (tech / open source community) https://fosstodon.org/@kde # hachyderm.io (tech community) https://hachyderm.io/@kelsey
All instances running Mastodon (or compatible ActivityPub software like Pleroma, Misskey, Calckey) use the same public API endpoint.
curl "https://pulse.walls.sh/profile?url=https://mastodon.social/@[email protected]"
The Webfinger-style @user@instance form resolves the account
on the correct home server automatically.
curl "https://pulse.walls.sh/history?url=https://mastodon.social/@Gargron"
{
"platform": "mastodon",
"kind": "profile",
"history": [
{ "followers": 380770, "posts": 81611, "fetchedAt": "2026-06-11T17:05:40Z" }
],
"velocity": { "followers_per_hour": 0 }
}
curl "https://pulse.walls.sh/profile/batch?urls=https://mastodon.social/@Gargron,https://fosstodon.org/@kde"
Mixed instances in one batch — up to 25 profiles, any combination of servers. Partial failures don't fail the whole batch.
import requests
r = requests.get("https://pulse.walls.sh/profile", params={"url": "https://mastodon.social/@Gargron"})
p = r.json()
print(f"@{p['handle']}@mastodon.social: {p['followers']:,} followers")
content_unavailable.verified field is null.fetch_failed. Try the canonical URL from the user's home server.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 · Mastodon post metrics · Bluesky follower count · X/Twitter follower count · all supported platforms.
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