Trends API
Free, authenticated access to EarlyForge's Pulse trend data — any account, just an API key.
The Trends API gives any signed-up account programmatic access to the exact same Pulse trend data already shown anonymously on pulse.earlyforge.ai — no paid plan required. It returns the same daily snapshot, the same number of trends, and the same fields the public page already shows: nothing more. It's simply an authenticated, documented path to that data instead of scraping HTML.
This is the entire EarlyForge public API — there is no other surface, on any plan. Articles, briefs, and alerts are console-only; they are not reachable via API keys.
Getting your API key
Open Settings → API Keys in the console and create a key — any plan, including Free, works. The key is shown once, at creation — copy it immediately, it cannot be revealed again.
Authentication
Send your key as a Bearer token on every request:
curl https://api.earlyforge.ai/v1/api/trends/top \
-H "Authorization: Bearer ef_live_xxxxxxxxxxxxxxxx"
A dashboard session also works for requests made from the console itself, but API keys are the supported way to call this API from your own code.
Rate limits
There is no monthly call quota on this API, for any plan — it's the same free, cached data the anonymous Pulse page already serves, so a quota would be arbitrary. Only the burst limit applies, same as the anonymous page: 60 requests / 60 seconds.
(There is no paid-tier quota either — the API has no other surface to meter.)
If your key was revoked or disabled, every call returns 401.
Data policy
This API is a verbatim proxy of the anonymous /v1/public/pulse/* endpoints that power pulse.earlyforge.ai. There is no limit, page, or extra filter parameter beyond what the public page itself exposes — an API key never sees more than an anonymous visitor already can.
Endpoints
/v1/api/trends/topQuery parameters
| Parameter | Type | Description |
|---|---|---|
date | string | Pick a past daily snapshot (YYYY-MM-DD). Omit for the latest. |
locale | string | Locale for translated fields, e.g. fr. |
curl "https://api.earlyforge.ai/v1/api/trends/top" \
-H "Authorization: Bearer ef_live_xxxxxxxxxxxxxxxx"{
"trends": [
{
"trend_id": "tr_a1b2c3",
"display_name": "AI regulation",
"region": "US",
"language": "en",
"categories": ["politics"],
"global_score": 87.5,
"lifecycle_stage": "growing",
"detected_at": "2026-11-01T10:00:00Z",
"hours_since_detection": 72.0,
"velocity_zscore": 1.8,
"acceleration": 0.3,
"n_sources": 12,
"source_diversity": 0.6,
"cross_lingual_root": false,
"entities": [{ "label": "EU AI Act", "type": "law", "qid": null }],
"description": "AI regulation heats up as the EU AI Act enters force."
}
],
"total": 1,
"cached_at": "2026-11-04T09:00:00Z",
"cache_ttl_seconds": 86400
}/v1/api/trends/region/{region}curl "https://api.earlyforge.ai/v1/api/trends/region/US" \
-H "Authorization: Bearer ef_live_xxxxxxxxxxxxxxxx"Same response shape as /v1/api/trends/top.
/v1/api/trends/category/{category}curl "https://api.earlyforge.ai/v1/api/trends/category/politics" \
-H "Authorization: Bearer ef_live_xxxxxxxxxxxxxxxx"Same response shape as /v1/api/trends/top.
/v1/api/trends/{trend_id}curl "https://api.earlyforge.ai/v1/api/trends/tr_a1b2c3" \
-H "Authorization: Bearer ef_live_xxxxxxxxxxxxxxxx"{
"trend_id": "tr_a1b2c3",
"display_name": "AI regulation",
"canonical_name": "ai-regulation",
"region": "US",
"language": "en",
"global_score": 87.5,
"sources": ["reddit", "news"],
"description": "AI regulation heats up as the EU AI Act enters force.",
"timeline": [
{ "ts": "2026-11-04T08:00:00Z", "score": 80.0, "sources_count": 10 },
{ "ts": "2026-11-04T09:00:00Z", "score": 87.5, "sources_count": 12 }
]
}A trend_id that doesn't exist returns 404.
Full reference
The complete OpenAPI contract is available in the repository at docs/api/public-api-v1/openapi.yaml.