Web Reactions API

Web Reactions collects one piece of data that's genuinely interesting on its own: the aggregate reaction counts of pages across the web. The plan is to expose that data as a small, read-only HTTP API anyone can build on.

Not available yet. Endpoints below are a design preview, not a contract. They will roll out gradually starting with the next few releases. Follow the repo or join the waitlist below to be the first to know when an endpoint goes live.

Get notified at launch

Leave your email and we will send a single message when the first endpoint goes live. No newsletter, no follow-ups — one launch email, then the address has done its job.

We store the address you enter (plus a hashed copy for de-duplication) until launch, only to send that one email. Details in the privacy policy.

Principles

Planned endpoints

1. Per-target reactions

Get the full reaction breakdown for one public target — a Facebook post, a GitHub repo, an Amazon product, and whatever else is supported by the time the endpoint ships.

GET /v1/reactions/{site}/{targetId}

{
  "site": "github",
  "targetId": "khasky/web-reactions",
  "total": 1284,
  "counts": {
    "❤️": 612,
    "🔥": 301,
    "👍": 189,
    "🎉": 102,
    "🤔": 80
  },
  "lastUpdated": 1747560000000
}

2. Batch reads

The same shape, multiplexed. Useful for embedding counts on a listing page where you have many targets in one render.

GET /v1/reactions/batch?t=github/khasky/web-reactions&t=amazon/B08N5WRWNW

3. Top pages

The most-reacted-to targets across a site, or globally, optionally windowed to a recent period. Useful for "what's everyone talking about right now" boards.

GET /v1/top?site=github&window=24h&limit=50

{
  "window": "24h",
  "items": [
    { "site": "github", "targetId": "user/repo",    "total": 921 },
    { "site": "github", "targetId": "user/other",   "total": 743 },
    ...
  ]
}

Supported windows under consideration: 1h, 24h, 7d, 30d, all.

4. Trending

Targets ranked by the rate of reactions in a window rather than the absolute count. A two-day-old post that gained 500 reactions today beats a five-year-old post that has 50 000 lifetime reactions but none today.

GET /v1/trending?site=facebook&window=1h&limit=20

5. Emoji popularity

Which emojis are most-used as reactions — globally, per site, or per time window. Answers "what does the modern web feel like today?" in one chart.

GET /v1/emojis?site=&window=7d&limit=25

{
  "window": "7d",
  "items": [
    { "reaction": "❤️", "count": 184_402 },
    { "reaction": "🔥", "count":  97_215 },
    { "reaction": "👍", "count":  88_117 },
    ...
  ]
}

6. Site activity

Time-bucketed totals per site: reactions per hour or per day, suitable for sparkline charts and longitudinal research. No targets, no users — just the count of votes landing in each bucket.

GET /v1/activity?site=amazon&bucket=hour&range=24h

{
  "site": "amazon",
  "bucket": "hour",
  "range": "24h",
  "buckets": [
    { "t": 1747551600000, "count": 412 },
    { "t": 1747555200000, "count": 388 },
    { "t": 1747558800000, "count": 506 },
    ...
  ]
}

7. Aggregate site stats

A one-line summary per site: total reactions ever recorded, total targets observed, number of supported items by category, and the timestamp of the most recent reaction.

GET /v1/sites/{site}/stats

{
  "site": "github",
  "totalReactions": 412_900,
  "uniqueTargets":   18_204,
  "topReactions": [ "❤️", "🔥", "👍", "🎉", "💯" ],
  "lastReactionAt":   1747560000000
}

What you could build

Six concrete use cases the planned endpoints are designed around, from one-evening widgets to full research pipelines:

Built for

The same open aggregates read very differently depending on who's holding them. Start from your corner:

Sample dashboards

Three small widgets showing what the responses render into. All numbers are illustrative mocks, not live data — the shapes match the endpoint examples above.

Reaction breakdown

612
301
189
102
80

GET /v1/reactions/github/khasky/web-reactions

Trending now

1github/acme/rocket+38% / 1h
2reddit/r/space/1abcd2+24% / 1h
3amazon/B08N5WRWNW+17% / 1h
4x/status/1799241150+11% / 1h

GET /v1/trending?window=1h&limit=20

Top emojis, 7 days

184k 97k 88k 61k 45k

GET /v1/emojis?window=7d&limit=5

Embeds and widgets

Beyond raw JSON, no-code surfaces so a creator, blogger, or shop can put counts on a page without touching the API:

Rate limits and fair use

Every endpoint will sit behind a per-IP rate limit chosen so a normal dashboard never hits it. Heavy users (research crawlers, public dashboards with global reach) should reach out before the first launch so the budget can be tuned rather than tripped.

Responses will set X-RateLimit-Remaining and X-RateLimit-Reset headers, and a 429 will always include a Retry-After value. Edge caching means most repeat fetches are free at the client.

Data license

Reaction counts are facts about public web pages, and the aggregates this API serves are open data. Once you hold a response you can republish it, mirror it, cache it, and build on it — commercially or not.

What it will not do

Join the API waitlist Follow on GitHub