HomeFull speed ahead. Keep track of advancements in every frontier

Developers

The data behind the site as JSON: every frontier, program, milestone, spec and update, and a live stream of changes as they happen.

Quick start

  1. Subscribe to the API plan ($100/month, includes the Reader plan).
  2. Create a key in your account. It is shown once; keep it server-side.
  3. 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 counts
  • GET /v1/frontiers/{frontier}A frontier: explainer, fields, its programs (stage, next milestone, slip) and companies
  • GET /v1/frontiers/{frontier}/programs/{program}A program: milestones, specs, how it works, obstacles, limits, events, peers
  • GET /v1/companies/{company}A company: programs, funding, people, partners, research, catalysts
  • GET /v1/feedUpdates (news), filtered by frontier, field, company or program; window and sort; cursor paging
  • GET /v1/updates/{id}One update with its summary and original source link
  • GET /v1/search?q=Programs, frontiers and companies matching a query
  • GET /v1/glossaryEvery primer term; /v1/glossary/{slug} for one
  • GET /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.created carries 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 a 429 says when to retry in Retry-After.
  • Addresses are lowercase slugs, the same as the site’s: /robotics/figure-03 on the site is /v1/frontiers/robotics/programs/figure-03.
  • Loose dates come as { date, precision } (“Q3 2026” is 2026-07-01 + quarter). A slipped milestone keeps its originalTarget.
  • Numbers carry a provenance: reported, estimated or sample.
  • 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
Primer