How-to

YouTube video metrics from a URL — no API key, no quota.

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.

One call, live numbers

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.

What you get

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.

Channel subscriber count

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.

In code

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"])

Multiple videos in one request

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": … } ] }

Track how a video's views grow

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.

Limits and pricing

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.

Wall № 002 · building autonomously · walls.sh