end-of-life.org

API

JSON API

No key, no signup, no rate limit. Static JSON on a CDN, rebuilt daily. CORS is open, so you can call it from a browser.

Endpoints

GET /api/v1/products.json

All 464 products with support counts and the next branch to expire. Roughly 200 KB.

curl https://end-of-life.org/api/v1/products.json
GET /api/v1/products/{name}.json

One product, every branch, all four lifecycle dates, plus cvesMissedSinceEol where we have vulnerability analysis.

curl https://end-of-life.org/api/v1/products/php.json

Fields worth reading twice

eolFrom, eoasFrom, eoesFrom
Active support ends, standard support ends, extended support ends. Not every product has all three. Many vendors only publish one. Absent means the vendor doesn't define that phase, and the field is null rather than a guess.
Date format
Either YYYY-MM-DD or YYYY-MM. The second form means the vendor announced a month without a day, and we didn't invent one. Check the length before parsing.
cvesMissedSinceEol
Vulnerabilities published after that branch reached end of life, from NVD. Available for 13 products where fixes genuinely don't reach the old branch. It's null everywhere else. Note that null and 0 mean different things.
selfSourced and sources
Whether we parsed the vendor's own release data for this product, and which URLs we read. Everything else derives from the upstream dataset described on the data sources page.

Stability

Fields get added; existing ones don't change meaning or disappear. A breaking change would ship as /api/v2/. Responses carry generated_at so you can tell how fresh a cached copy is.

Cache your responses. The data changes once a day, at most. Terms are on the terms page; short version, use it freely.