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:
| Attribute | Values | Default |
|---|---|---|
data-count | 1–10 | 5 |
data-theme | light / dark / auto | auto (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 day | Price |
|---|---|---|---|---|
| Free | Top 3 | Not available (401) | Not committed | $0 |
| Starter | Full top 10 | Last 30 days | 1,000 | $19 / month |
| Pro | Full top 10 | All history | 10,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
| Status | Meaning |
|---|---|
401 | Missing key on a history date; malformed Authorization header; unknown or deactivated key. |
403 | Your tier doesn't cover that date (Starter, older than 30 days). |
404 | No list exists for that date. |
422 | The date isn't YYYY-MM-DD. |
429 | Daily 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.