The YouTube Data API needs OAuth and a quota. TikTok's API is invite-only. Instagram's Graph API requires an app review. Pulse sidesteps all of it: one GET request, any public post URL, normalized JSON back. Free for individuals.
GET https://pulse.walls.sh/metrics?url=<post-url>
Returns { platform, views, likes, comments, shares, quotes, bookmarks,
publishedAt, title, author, thumbnail }. Works from any server, any language, any environment
that can make an HTTP request — no setup, no rate-limit headers to negotiate before you start.
curl "https://pulse.walls.sh/metrics?url=https://www.youtube.com/watch%3Fv%3DdQw4w9WgXcQ"
{
"platform": "youtube",
"views": 1781545261,
"likes": 19149342,
"publishedAt": "2009-10-25T06:57:33.000Z",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"author": "Rick Astley",
"thumbnail": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp"
}
No YouTube Data API key. No quota. Reads the same page a browser reads, from a residential IP — so it sees the real public numbers, not zeros or errors.
curl "https://pulse.walls.sh/metrics?url=https://www.tiktok.com/@khaby.lame/video/6967348974688816390"
{
"platform": "tiktok",
"views": 39600000,
"likes": 5500000,
"comments": 39500,
"shares": 22300,
"publishedAt": "2021-05-28T14:32:30.000Z"
}
TikTok's official API is closed to most developers. Pulse reads the public embed page instead — the same data a visitor sees.
curl "https://pulse.walls.sh/metrics?url=https://x.com/naval/status/1002103360646823936"
{
"platform": "x",
"likes": 273332,
"shares": 78863,
"quotes": 13002,
"bookmarks": 202737,
"title": "How to Get Rich (without getting lucky):",
"author": "@naval"
}
Includes retweets (shares), quote tweets, and bookmarks — the full
engagement surface X exposes publicly.
JavaScript / Node
const res = await fetch(
"https://pulse.walls.sh/metrics?url=" +
encodeURIComponent("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
);
const { views, likes, publishedAt } = await res.json();
console.log(views, likes, publishedAt);
Python
import requests, urllib.parse
url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
r = requests.get(
"https://pulse.walls.sh/metrics",
params={"url": url}
)
data = r.json()
print(data["views"], data["likes"])
GET /metrics/batch?url=URL_A&url=URL_B&url=URL_C
Up to 50 URLs per request, posts and profile URLs mixed, order preserved.
One bad URL returns { url, error } and never fails the whole batch.
curl "https://pulse.walls.sh/profile?url=https://www.youtube.com/@MrBeast"
{
"platform": "youtube",
"handle": "@MrBeast",
"followers": 498000000,
"posts": 985,
"verified": true
}
Works for YouTube, TikTok, Instagram, X, Bluesky, and Mastodon profiles.
Every call records a snapshot. GET /history?url=… returns the full
series — likes, views, shares over time — without you running a cron job or keeping a database.
Poll the delta with since=<ISO-timestamp> to get only new points.
Free: 120 calls/minute, no account needed. Commercial or higher-volume use gets
a $19/mo Pro plan (higher rate limit, commercial terms) — see
the pricing page or sign up at
/account for a key and Pro checkout. All endpoints speak
standard 429 + Retry-After and return RateLimit-* headers so you
can self-throttle before hitting the limit.
More: full API docs · OpenAPI spec · the blog · MCP setup for Claude / Cursor.