Getting view counts and likes from YouTube programmatically usually means registering a project, creating credentials, handling OAuth or API keys, and staying inside a 10,000-unit daily quota. Pulse skips all of that: one GET request with a YouTube URL returns the numbers directly.
curl "https://pulse.walls.sh/metrics?url=https://www.youtube.com/watch?v=dQw4w9WgXcQ"
{
"platform": "youtube",
"views": 1781561402,
"likes": 19149427,
"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"
}
That's a live response — the numbers above were real when this was written.
Pulse reads YouTube's public page from a residential IP, so it sees the same numbers a
browser sees. Short URLs (youtu.be/…) resolve automatically.
Every YouTube response includes: views, likes,
publishedAt, title, author, and thumbnail.
These map directly to the fields most commonly pulled from the YouTube Data API's
videos.list endpoint (the statistics and snippet parts).
Comment count is not currently returned for YouTube.
curl "https://pulse.walls.sh/profile?url=https://www.youtube.com/@MrBeast"
{
"platform": "youtube",
"handle": "@MrBeast",
"followers": 498000000,
"posts": 985
}
Profile URLs return subscriber count (followers) and video count
(posts) for any public YouTube channel.
JavaScript / Node
const videoUrl = "https://www.youtube.com/watch?v=dQw4w9WgXcQ";
const res = await fetch(
"https://pulse.walls.sh/metrics?url=" + encodeURIComponent(videoUrl)
);
const { views, likes, publishedAt, title } = await res.json();
console.log({ views, likes, publishedAt, title });
Python
import requests
video_url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
data = requests.get(
"https://pulse.walls.sh/metrics",
params={"url": video_url}
).json()
print(data["views"], data["likes"], data["publishedAt"])
GET /metrics/batch?url=URL_A&url=URL_B&url=URL_C
Up to 50 YouTube URLs per request, order preserved, results returned as an
array. One URL that fails (private video, deleted post) comes back as
{ url, error } and never fails the whole batch. Mix YouTube with TikTok,
X, and Bluesky in the same batch call — same endpoint, same shape.
curl "https://pulse.walls.sh/metrics/batch?url=YT_URL_1&url=YT_URL_2"
# → { "count": 2, "results": [ { "views": …, "likes": … }, { "views": …, "likes": … } ] }
Every /metrics call records a timestamped snapshot. After you've
fetched a video at least twice, /history returns the full series:
curl "https://pulse.walls.sh/history?url=https://www.youtube.com/watch?v=dQw4w9WgXcQ"
# → { "points": [ { "t": "…", "views": 1780000000, "likes": 19100000 }, … ] }
Add &since=<ISO-timestamp> to get only the new points since
your last poll — no need to download the full series each time. Pulse keeps the snapshots; you
don't need a database.
Free: 120 calls/minute, no account or signup required. For commercial use or
higher volume, the $19/mo Pro plan raises the limit to 1,200 calls/minute (10×) and includes
commercial terms — see pricing or sign up at
/account. All endpoints follow standard
429 + Retry-After conventions and expose RateLimit-* headers so
your code can self-throttle before hitting the ceiling.
More: full API docs · OpenAPI spec · all supported platforms · MCP setup for Claude / Cursor.