eosl.ai
Developer API

Free JSON API for hardware lifecycle data

Every end-of-sale and end-of-service-life date on EOSL.ai is available as clean, source-linked JSON — no key, no login, CORS-open. Build it into your CMDB, a Slack bot, a dashboard, or an agent. Please cache and attribute EOSL.ai.

Endpoints

GET /api/v1/families.jsonIndex of every tracked product family — slug, vendor, series, category, status, EOSL, and detail URL.
GET /api/v1/family/{slug}.jsonFull detail for one family: every SKU group with end-of-sale, EOSL, source bulletin URL, last-verified date, replacement and part numbers.
GET /api/usageAggregate usage of these machine surfaces — which kinds of client called which endpoint on how many days. No IP addresses, no emails, no request counts (read the note field before quoting any figure). Part-level sightings exist but are not published.
POST /api/registerIssues a free, optional API key instantly — see below. The key gates nothing; it attributes your usage to you.
GET /data/lookup.jsonCompact part-number → status map that powers the bulk checker.
GET /cell/{part}.txtOne-line plaintext status for a part number — made for spreadsheets: Google Sheets =IMPORTDATA("https://eosl.ai/cell/ws-c3850-24t-l.txt"), Excel on Windows =WEBSERVICE(…). Comma-free by design so Sheets keeps it in one cell. For whole inventories use lookup.json instead (Sheets caps IMPORTDATA calls per sheet).
GET /badge/{slug}.svgLive status badge image for a family (see the badge builder).
POST /mcpLive MCP server for AI agents — five lookup tools over this same data (see the MCP docs).
GET /dataset/eosl.csvThe whole database as one open CSV/JSON download, CC BY 4.0 (see the dataset page).

Example — /api/v1/family/cisco-catalyst-3850.json

{
  "slug": "cisco-catalyst-3850",
  "vendor": "Cisco",
  "line": "Catalyst",
  "series": "3850 Series",
  "category": "Stackable access switch",
  "generalAvailability": "2013-01",
  "url": "https://eosl.ai/system/cisco-catalyst-3850/",
  "badge": "https://eosl.ai/badge/cisco-catalyst-3850.svg",
  "status": {
    "key": "mixed",
    "label": "Mixed — varies by part number",
    "monthsToEosl": -10
  },
  "lifecycle": {
    "status": "mixed",
    "supportedPartCount": 20,
    "unsupportedPartCount": 29,
    "earliestEosl": "2025-10",
    "latestEosl": "2027-04",
    "exactPartRequired": true
  },
  "supportRunwayScore": {
    "score": 23,
    "band": "Little or no runway",
    "factors": [
      "Past end of service life — 10 months ago",
      "Vendor-published date, source-linked",
      "Mixed status across SKU groups — some past EOSL, some still supported",
      "Vendor-named replacement / migration path available",
      "Category: stackable access switch"
    ],
    "methodology": "https://eosl.ai/methodology/exposure-score/"
  },
  "exposureScore": {
    "score": 23,
    "band": "Little or no runway",
    "factors": [
      "Past end of service life — 10 months ago",
      "Vendor-published date, source-linked",
      "Mixed status across SKU groups — some past EOSL, some still supported",
      "Vendor-named replacement / migration path available",
      "Category: stackable access switch"
    ],
    "methodology": "https://eosl.ai/methodology/exposure-score/",
    "note": "legacy alias of supportRunwayScore — same number, higher = more support runway"
  },
  "skuCount": 49,
  "skuGroups": [
    {
      "label": "Copper SKUs",
      "endOfSale": "2020-10",
      "endOfServiceLife": "2025-10",
      "eoslComputed": false,
      "active": false,
      "lastFirmware": "IOS XE 16.12.x",
      "lastServiceExtension": null,
      "sourceUrl": "https://www.cisco.com/c/en/us/products/collateral/switches/catalyst-3850-series-switches/eos-eol-notice-c51-743072.html",
      "policyUrl": null,
      "lastVerified": "2026-06",
      "replacement": "Cisco Catalyst 9300 Series",
      "skus": [
        {
          "partNumber": "WS-C3850-24T-L",
          "description": null,
          "replacement": "C9300-24T-E"
        },
        {
          "partNumber": "WS-C3850-24T-S",
          "description": null,
          "replacement": "C9300-24T-A"
        },
        {
          "partNumber": "WS-C3850-24T-E",
          "description": null,
          "replacement": "C9300-24T-A"
        },
        {
          "partNumber": "WS-C3850-48T-L",
          "description": null,
          "replacement": "C9300-48T-E"
        },
        {
          "partNumber": "WS-C3850-48T-S",
          "description": null,
          "replacement": "C9300-48T-A"
        },
        {
          "partNumber": "WS-C3850-48T-E",
          "description": null,
          "replacement": "C9300-48T-A"
        },
        {
          "partNumber": "WS-C3850-24P-L",
          "description": null,
          "replacement": "C9300-24P-E"
        },
        {
          "partNumber": "WS-C3850-24P-S",
          "description": null,
          "replacement": "C9300-24P-A"
        },
        {
          "partNumber": "WS-C3850-24P-E",
          "description": null,
          "replacement": "C9300-24P-A"
        },
        {
          "partNumber": "WS-C3850-48P-L",
          "description": null,
          "replacement": "C9300-48P-E"
        },
        {
          "partNumber": "WS-C3850-48P-S",
          "description": null,
          "replacement": "C9300-48P-A"
        },
        {
          "partNumber": "WS-C3850-48P-E",
          "description": null,
          "replacement": "C9300-48P-A"
        },
        {
          "partNumber": "WS-C3850-48F-L",
          "description": null,
          "replacement": "C9300-48P-E"
        },
        {
          "partNumber": "WS-C3850-48F-S",
          "description": null,
          "replacement": "C9300-48P-A"
        },
        {
          "partNumber": "WS-C3850-48F-E",
          "description": null,
          "replacement": "C9300-48P-A"
        },
        {
          "partNumber": "WS-C3850-24U-L",
          "description": null,
          "replacement": "C9300-24U-E"
        },
        {
          "partNumber": "WS-C3850-24U-S",
          "description": null,
          "replacement": "C9300-24U-A"
        },
        {
          "partNumber": "WS-C3850-24U-E",
          "description": null,
          "replacement": "C9300-24U-A"
        },
        {
          "partNumber": "WS-C3850-48U-L",
          "description": null,
          "replacement": "C9300-48U-E"
        },
        {
          "partNumber": "WS-C3850-48U-S",
          "description": null,
          "replacement": "C9300-48U-A"
        },
        {
          "partNumber": "WS-C3850-48U-E",
          "description": null,
          "replacement": "C9300-48U-A"
        },
        {
          "partNumber": "WS-C3850-12X48U-L",
          "description": null,
          "replacement": "C9300-48UXM-E"
        },
        {
          "partNumber": "WS-C3850-12X48U-S",
          "description": null,
          "replacement": "C9300-48UXM-A"
        },
        {
          "partNumber": "WS-C3850-12X48U-E",
          "description": null,
          "replacement": "C9300-48UXM-A"
        },
        {
          "partNumber": "WS-C3850-24XU-L",
          "description": null,
          "replacement": "C9300-24U-E"
        },
        {
          "partNumber": "WS-C3850-24XU-S",
          "description": null,
          "replacement": "C9300-24U-A"
        },
        {
          "partNumber": "WS-C3850-24XU-E",
          "description": null,
          "replacement": "C9300-24U-A"
        },
        {
          "partNumber": "C1-WSC3850-12X48UL",
          "description": null,
          "replacement": "C9300-48UXM-A"
        },
        {
          "partNumber": "C1-WSC3850-24XUL",
          "description": null,
          "replacement": "C9300-24UX-A"
        }
      ]
    },
    {
      "label": "Fiber (SFP/SFP+) SKUs",
      "endOfSale": "2022-04",
      "endOfServiceLife": "2027-04",
      "eoslComputed": false,
      "active": false,
      "lastFirmware": "IOS XE 16.12.x",
      "lastServiceExtension": null,
      "sourceUrl": "https://www.cisco.com/c/en/us/products/collateral/switches/catalyst-3850-series-switches/eos-eol-notice-c51-2438804.html",
      "policyUrl": null,
      "lastVerified": "2026-06",
      "replacement": "Cisco Catalyst 9300/9300X and 9500",
      "skus": [
        {
          "partNumber": "WS-C3850-12S-E",
          "description": null,
          "replacement": "C9300-24S"
        },
        {
          "partNumber": "WS-C3850-12S-S",
          "description": null,
          "replacement": "C9300-24S"
        },
        {
          "partNumber": "WS-C3850-12XS-E",
          "description": null,
          "replacement": "C9300X-12Y"
        },
        {
          "partNumber": "WS-C3850-12XS-S",
          "description": null,
          "replacement": "C9300X-12Y"
        },
        {
          "partNumber": "WS-C3850-16XS-E",
          "description": null,
          "replacement": "C9300X-12Y"
        },
        {
          "partNumber": "WS-C3850-16XS-S",
          "description": null,
          "replacement": "C9300X-12Y"
        },
        {
          "partNumber": "WS-C3850-24S-E",
          "description": null,
          "replacement": "C9300-24S"
        },
        {
          "partNumber": "WS-C3850-24S-S",
          "description": null,
          "replacement": "C9300-24S"
        },
        {
          "partNumber": "WS-C3850-24XS-E",
          "description": null,
          "replacement": "C9300X-24Y"
        },
        {
          "partNumber": "WS-C3850-24XS-S",
          "description": null,
          "replacement": "C9300X-24Y"
        },
        {
          "partNumber": "WS-C3850-32XS-E",
          "description": null,
          "replacement": "C9300X-24Y"
        },
        {
          "partNumber": "WS-C3850-32XS-S",
          "description": null,
          "replacement": "C9300X-24Y"
        },
        {
          "partNumber": "WS-C3850-48XS-E",
          "description": null,
          "replacement": "C9500-48Y4C"
        },
        {
          "partNumber": "WS-C3850-48XS-F-E",
          "description": null,
          "replacement": "C9500-48Y4C"
        },
        {
          "partNumber": "WS-C3850-48XS-F-S",
          "description": null,
          "replacement": "C9500-48Y4C"
        },
        {
          "partNumber": "WS-C3850-48XS-S",
          "description": null,
          "replacement": "C9500-48Y4C"
        },
        {
          "partNumber": "C1-WS3850-12XS-S",
          "description": null,
          "replacement": "C9300X-12Y"
        },
        {
          "partNumber": "C1-WSC3850-24XS-S",
          "description": null,
          "replacement": "C9300X-24Y"
        },
        {
          "partNumber": "C1-WSC3850-48XS-FS",
          "description": null,
          "replacement": "C9500-48Y4C"
        },
        {
          "partNumber": "C1-WSC3850-48XS-S",
          "description": null,
          "replacement": "C9500-48Y4C"
        }
      ]
    }
  ]
}

Notes

Source-backed

Every date carries the sourceUrl of the vendor bulletin it came from. Computed EOSL dates are flagged eoslComputed:true with a policyUrl.

CORS-open, cache-friendly

All endpoints send Access-Control-Allow-Origin: * and are static — fetch them from the browser or a server. Please cache; the data changes at most weekly.

Stable slugs

Family slugs match the site URLs (https://eosl.ai/system/{slug}/), so you can link users straight to the human page.

Attribution

Free to use. If you surface these dates, credit EOSL.ai and link back so your users can reach the source bulletin.

Nothing is gated — a key is optional identity

Every endpoint here works with no key and always will: gating them would make the MCP server invisible to the agents it exists for and break the NetBox, Ansible and Snipe-IT plugins on install. A key from the form below changes only whose name is on your usage. Without one, send a descriptive User-Agent (e.g. my-tool/1.0) and that is how you appear in the public usage report.

Get a key — optional, instant, free

Everything above works without one. A key does exactly one thing: it puts your name on your own usage. Requests carrying it are attributed to your key in EOSL.ai's internal usage reporting (your email is never published anywhere), including which part numbers you looked up — so heavy lookups steer what gets covered next. Attach it as an X-EOSL-Key header, or ?key= where headers are impossible (Google Sheets). No password, no account, nothing to cancel.

There is no key, no quota and no rate-limit form to fill in — the endpoints are static JSON on a CDN, so use them as hard as you like. Want the whole thing at once instead of endpoint by endpoint? Take the open dataset; it is CC BY 4.0, so you may redistribute it commercially with attribution.