API · V1 · STATIC JSON
The receipts, machine-readable.
Every number LE TEEN publishes — the 30-year NPV for 500 U.S. colleges, lifetime ROI for 134 majors, the standing rankings — as plain JSON over GET. No key. No signup. No rate limit beyond CDN sanity. CORS open, so it works straight from a browser. Same computation as the pages, by construction: the API and the site can’t disagree.
Endpoints
| Endpoint | What you get |
|---|---|
/api/v1/index.json | API root — endpoint list, license, DOI. |
/api/v1/majors.json | All 19 major categories + 115 subfields, full lifetime-ROI stat set. |
/api/v1/majors/{slug}.json | One major, same stats. |
/api/v1/colleges.json | The 500 largest-coverage schools that clear our gates: 30-year NPV, cost, earnings, break-even age. |
/api/v1/colleges/{slug}.json | One school. |
/api/v1/rankings/out-of-state-penalty.json | The out-of-state tuition penalty ranking, worst-first. |
/api/v1/rankings/best-value.json | Best-value colleges, top 15 per state, all 50 states + DC. |
/api/v1/openapi.json | OpenAPI 3.1 spec for all of the above. |
Every payload carries a meta block — source, license,
DOI, data vintage, build date. {slug} endpoints are
one static file per major/school; the links above open a live
example. The full machine description is the
OpenAPI 3.1 spec.
Use it
curl
curl https://le-teen.com/api/v1/majors/registered-nursing.json JavaScript
const res = await fetch('https://le-teen.com/api/v1/colleges.json');
const { colleges } = await res.json();
const worthIt = colleges.filter(c => c.npv_30yr_resident_usd > 1_000_000); Python (stdlib only)
import json, urllib.request
url = "https://le-teen.com/api/v1/rankings/out-of-state-penalty.json"
with urllib.request.urlopen(url) as r:
ranking = json.load(r)
worst = ranking["rankings"][0]
print(worst["institution"], worst["oos_penalty_30yr_npv_usd"]) What’s behind the numbers
FREOPP 2021 program-level earnings, IPEDS 2023 cost, BEA 2023 regional price parities — public data, named inline, same model as the calculator. Colleges appear only if they clear our editorial gates (real FREOPP earnings from at least 3 reported programs, hand-verified exclusions, and a positive 30-year NPV at resident pricing) — absence is a coverage statement, not a verdict. Read the methodology before you cite a number; it also lists the limitations we know about.
Want the raw spine instead of an API? The full dataset is DOI-registered: 10.5281/zenodo.21351602 · GitHub.
License & attribution
CC BY 4.0 — free to use, cache, republish, and build on. The ask is one line: cite LE TEEN, le-teen.com (and FREOPP / IPEDS / BEA as the upstream sources). For a stable reference, cite the DOI. Building something on this? Press and data questions: /press.
Cite this:
LE TEEN (2026). "College ROI API v1." Data: FREOPP 2021 · IPEDS 2023 · BEA 2023. https://le-teen.com/api