Quick start
- Subscribe to the API plan ($100/month, includes the Reader plan).
- Create a key in your account. It is shown once; keep it server-side.
- Send it as a bearer token:
curl -H "Authorization: Bearer $TO_KEY" \
"https://api.technooptimist.io/v1/frontiers/robotics/programs/figure-03"const res = await fetch("https://api.technooptimist.io/v1/feed?frontier=energy&window=week&sort=latest", {
headers: { Authorization: `Bearer ${process.env.TO_KEY}` },
});
const { items, nextCursor } = await res.json();Endpoints
GET /v1/frontiersEvery frontier with countsGET /v1/frontiers/{frontier}A frontier: explainer, fields, its programs (stage, next milestone, slip) and companiesGET /v1/frontiers/{frontier}/programs/{program}A program: milestones, specs, how it works, obstacles, limits, events, peersGET /v1/companies/{company}A company: programs, funding, people, partners, research, catalystsGET /v1/feedUpdates (news), filtered by frontier, field, company or program; window and sort; cursor pagingGET /v1/updates/{id}One update with its summary and original source linkGET /v1/search?q=Programs, frontiers and companies matching a queryGET /v1/glossaryEvery primer term; /v1/glossary/{slug} for oneGET /v1/statsSite-wide counts
Every field, parameter and response is in the full reference (opens api.technooptimist.io) (OpenAPI 3.1 at /v1/openapi.json).
Realtime
- One WebSocket carries new updates and program stage changes the moment they are written.
- Topics:
all,frontier:<slug>,company:<slug>,program:<company>/<program>; up to 50 per subscribe. - Each
update.createdcarries the full feed item, so there is nothing to refetch.
const ws = new WebSocket("wss://api.technooptimist.io/v1/stream?api_key=" + process.env.TO_KEY);
ws.onopen = () => ws.send(JSON.stringify({ type: "subscribe", topics: ["frontier:energy"] }));
ws.onmessage = (e) => {
const m = JSON.parse(e.data);
if (m.type === "update.created") console.log(m.data.headline, m.data.sourceUrl);
};No WebSocket? The same messages stream as Server-Sent Events from /v1/stream/sse?topics=all.
Limits and conventions
- No monthly quota. Each key may burst to 20 requests a second (1,200 a minute); every response carries
X-RateLimit-Remaining, and a429says when to retry inRetry-After. - Addresses are lowercase slugs, the same as the site’s:
/robotics/figure-03on the site is/v1/frontiers/robotics/programs/figure-03. - Loose dates come as
{ date, precision }(“Q3 2026” is2026-07-01+quarter). A slipped milestone keeps itsoriginalTarget. - Numbers carry a
provenance:reported,estimatedorsample. - Every update links its original source in
sourceUrl. - Errors are JSON:
{ error: { code, message } }with the matching HTTP status.
API plan · $100/month
- Unlimited requests to the data API (REST + realtime stream)
- Frontiers, programs, milestones, specs, updates and companies as JSON
- Keys managed from your account; includes the Reader plan