AI Pulse API

One JSON endpoint that answers "what's trending in AI today?" with a ranked top 10, each item clustered from Hacker News, arXiv and GitHub by an LLM, with a headline, a 2–3 sentence summary and links to the underlying sources. Updated daily. Base URL: https://aipulseapi.com.

Quick start

No key needed to try it. This returns today's top 3:

curl https://aipulseapi.com/v1/trends/today

With a key you get the full top 10 and, depending on tier, history:

curl -H "Authorization: Bearer aip_your_key_here" https://aipulseapi.com/v1/trends/today
curl -H "Authorization: Bearer aip_your_key_here" https://aipulseapi.com/v1/trends/2026-09-15

Authentication

Send your key as a bearer token on every request: Authorization: Bearer <key>. Keys start with aip_ and are emailed to you after checkout. Requests without the header get the free tier. A malformed header, an unknown key, or a key whose subscription has ended gets 401; there is no silent fallback to the free tier.

Endpoints

GET /v1/trends/today

Today's list (UTC date). Free tier: top 3. Any active key: full top 10.

GET /v1/trends/{date}

The list for a past day, YYYY-MM-DD in UTC. Requires a key. Starter keys can fetch any date in the last 30 days; older dates return 403. Pro keys can fetch any date we have. A date with no list (before launch, or before that day's run) returns 404.

Response shape

{
  "date": "2026-09-16",
  "tier": "starter",
  "count": 10,
  "trends": [
    {
      "rank": 1,
      "headline": "OpenAI acquires Glass Imaging for $300M",
      "summary": "Two or three sentences on what happened and why it matters.",
      "score": 0.92,
      "source_item_ids": [175, 176],
      "sources": [
        {"source": "hn", "title": "OpenAI acquires Glass Imaging", "url": "https://..."},
        {"source": "arxiv", "title": "...", "url": "https://arxiv.org/abs/..."}
      ]
    }
  ]
}

tier tells you which tier served the response (free, starter, pro). score is a 0–1 trend-strength estimate relative to the same day's other items. sources are the underlying posts, papers and repos, strongest signal first; source is one of hn, arxiv, github.

GET /health

Liveness check. Returns {"status": "ok", "utc_date": "..."}. No auth.

Embedding

Starter and Pro subscribers can show the trends feed on their own site with a widget, instead of (or alongside) calling the API. Paste this anywhere on a page:

<script src="https://aipulseapi.com/embed.js" data-key="aipe_your_embed_key"></script>

It mounts a small, self-contained card right after the script tag — no other markup or CSS needed. Optional attributes on the same tag:

AttributeValuesDefault
data-count1–105
data-themelight / dark / autoauto (matches visitor's OS setting)

The embed key is different from your API key — it's emailed alongside it, starts with aipe_, and is meant to live in public page source. It can only fetch today's top 10 through GET /v1/embed/data?key=... (the endpoint the widget itself calls); it can never authenticate the Bearer API, fetch history, or do anything your API key can do. If it ends up on a much higher-traffic page than expected, embed views have their own generous daily cap (well above normal API rate limits) that's separate from your daily_call_limit above — hitting it returns 429 on the widget only, your API key is unaffected.

Tiers

Tier/v1/trends/today/v1/trends/{date}Calls per dayPrice
FreeTop 3Not available (401)Not committed$0
StarterFull top 10Last 30 days1,000$19 / month
ProFull top 10All history10,000 (ask if you need more)$79 / month

Subscribe on the pricing page. Billing is monthly through Stripe; cancel any time and the key stops working when the period ends.

Rate limits

Every request made with a valid key counts toward that key's daily cap, including requests that then fail a tier check (a Starter key asking for a 60-day-old date still uses one call). Counters reset at 00:00 UTC. Responses made with a key carry X-RateLimit-Limit and X-RateLimit-Remaining headers. Once you're over the cap you get 429 with a Retry-After header (seconds until reset).

The list only changes once a day, so caching a response for an hour is a good idea. Don't poll.

Errors

StatusMeaning
401Missing key on a history date; malformed Authorization header; unknown or deactivated key.
403Your tier doesn't cover that date (Starter, older than 30 days).
404No list exists for that date.
422The date isn't YYYY-MM-DD.
429Daily call limit reached for this key.

All errors are JSON: {"detail": "human-readable message"}.

Data and freshness

Each day's list is generated from the previous ~24 hours of Hacker News stories, ~48 hours of new cs.AI / cs.LG / cs.CL arXiv papers, and GitHub repositories created in the last week, all filtered for AI relevance, clustered and ranked by an LLM. Dates are UTC. Lists are not regenerated after the day ends, so a historical date always returns what subscribers saw that day.

Questions or a lost key: reply to any email from us, or write to the address in your receipt.