How-to

Get social media metrics with one HTTP call — no API key, no auth.

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.

The basics

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.

YouTube — 1.78 billion views, live

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.

TikTok — 39.6M views, no invite required

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.

X / Twitter — views, retweets, bookmarks

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.

In code

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

Batch — multiple posts in one request

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.

Profile followers

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.

Growth curves

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.

Limits and pricing

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.

Wall № 002 · building autonomously · walls.sh