Emojery API

An API over the aggregate reaction counts, for dashboards, research, and widgets.

Not available yet. Endpoints below are a design preview rather than 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/emojery",
  "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/emojery&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 2-day-old post that gained 500 reactions today beats a 5-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
}

8. Creator totals

Every reaction the web left on one public account's work, rolled up by handle: a YouTube channel, a GitHub owner, a shop brand. Returns the account total, its emoji mix, and its own targets ranked, so a creator page or a profile badge is one call.

GET /v1/creators/{site}/{handle}?limit=20

{
  "site": "youtube",
  "handle": "@example",
  "total": 48_120,
  "counts": { "❤️": 21_004, "🔥": 9_880, "👍": 8_412 },
  "targets": [
    { "targetId": "dQw4w9WgXcQ", "total": 6_301 },
    { "targetId": "kJQP7kiw5Fk", "total": 4_155 },
    ...
  ]
}

Reactions other people left on public posts, grouped by the account that published them. It says nothing about who reacted, and the grouping comes from the public identifier of each post, never from anything about the people reacting.

9. Public mood

Emoji popularity one level up: emoji folded into named groups, so a day reads as a single mix instead of 600 separate counters. Per site, globally, and comparable between windows.

GET /v1/mood?site=&window=24h

{
  "window": "24h",
  "sample": 612_004,
  "mix": {
    "positive":  0.58,
    "playful":   0.17,
    "negative":  0.14,
    "surprised": 0.11
  },
  "topEmoji": [ "❤️", "🔥", "😂" ],
  "shift": { "negative": 0.04 }
}

The grouping is ours and ships published alongside the endpoint. The raw per-emoji counts stay available, so you can regroup them your own way.

10. On this day

What the web reacted to on one calendar date, year by year, as far back as the log goes. Feeds a "a year ago today" strip, a retro board, or a look at how the same date felt in different years.

GET /v1/on-this-day?date=05-19&limit=10

{
  "date": "05-19",
  "years": [
    {
      "year": 2026,
      "total": 88_412,
      "topEmoji": "🔥",
      "items": [
        { "site": "youtube", "targetId": "dQw4w9WgXcQ", "total": 6_301 },
        ...
      ]
    },
    { "year": 2025, "total": 41_005, "topEmoji": "❤️", "items": [ ... ] }
  ]
}

What you could build

6 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

3 small widgets showing what the responses render into. All numbers are illustrative mocks rather than live data — the shapes match the endpoint examples above.

Reaction breakdown

612
301
189
102
80

GET /v1/reactions/github/khasky/emojery

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.

Forks and other clients

The extension is GPL-3.0: read it, study it, modify it, and run your build locally for learning or research. What the license does not hand over is the backend: a build from the public source targets the staging environment, and pointing it at a backend of your own is a build-time setting the repository documents. Reading reactions needs no permission at all, from the public log, the status feed, or the badges.

If your client needs the hosted service instead, that is a request rather than a refusal. Write to [email protected] or open a question on the tracker with 4 things:

What comes back is a named client with its own quota, revocable, under the same acceptable use policy everyone else signs in under. Until the data API launches this is handled case by case, and the answer to a client that would submit reactions on someone's behalf is no, for the reason the section below gives. An unapproved client calling the extension endpoints is a policy violation, and asking is simply the cheaper path: an approved client gets a quota and a conversation before anything changes under it, while an unapproved one finds out by being cut off.

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