{
 "openapi": "3.1.0",
 "info": {
  "title": "EOSL.ai Hardware Lifecycle API",
  "version": "1.0.0",
  "summary": "Source-backed hardware end-of-sale and end-of-service-life dates.",
  "description": "Free, CORS-open, no authentication and no sign-up. Every record carries the vendor bulletin URL the date was read from. 2727 products, 11442 part numbers, 19 manufacturers. Data is regenerated weekly from vendor sources.",
  "license": {
   "name": "CC BY 4.0",
   "identifier": "CC-BY-4.0"
  },
  "contact": {
   "name": "EOSL.ai",
   "url": "https://eosl.ai/api/"
  }
 },
 "servers": [
  {
   "url": "https://eosl.ai"
  }
 ],
 "paths": {
  "/api/v1/families.json": {
   "get": {
    "summary": "Every tracked product",
    "operationId": "listFamilies",
    "description": "Index of all tracked hardware products with status, dates and page URL.",
    "responses": {
     "200": {
      "description": "Product index",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/api/v1/family/{slug}.json": {
   "get": {
    "summary": "One product in full",
    "operationId": "getFamily",
    "description": "Every SKU group for one product: end-of-sale, end-of-service-life, source bulletin URL, last-verified date, vendor-named replacement and part numbers.",
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Product slug, e.g. cisco-catalyst-3850"
     }
    ],
    "responses": {
     "200": {
      "description": "Product detail",
      "content": {
       "application/json": {}
      }
     },
     "404": {
      "description": "Unknown product"
     }
    }
   }
  },
  "/data/lookup.json": {
   "get": {
    "summary": "Part-number lookup table",
    "operationId": "getLookup",
    "description": "One row per part number — the dataset the browser tools, the MCP server and the NetBox/Ansible/Snipe-IT integrations all read.",
    "responses": {
     "200": {
      "description": "Lookup table",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/cell/{part}.txt": {
   "get": {
    "summary": "One-line status for a spreadsheet",
    "operationId": "getCell",
    "description": "A single comma-free line for =IMPORTDATA (Google Sheets) or =WEBSERVICE (Excel).",
    "parameters": [
     {
      "name": "part",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Part number, e.g. WS-C3850-24T-L.txt"
     }
    ],
    "responses": {
     "200": {
      "description": "Status line",
      "content": {
       "text/plain": {}
      }
     }
    }
   }
  },
  "/api/usage": {
   "get": {
    "summary": "Aggregate usage of these machine surfaces",
    "operationId": "getUsage",
    "description": "Which kinds of client called which endpoint, on how many days. Public deliberately. Read the note field before quoting any figure — these are sightings, not request counts.",
    "responses": {
     "200": {
      "description": "Usage report",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  },
  "/mcp": {
   "post": {
    "summary": "Model Context Protocol endpoint",
    "operationId": "mcp",
    "description": "Stateless Streamable HTTP, JSON-RPC 2.0, no auth. Five read-only tools over the same database.",
    "responses": {
     "200": {
      "description": "JSON-RPC response",
      "content": {
       "application/json": {}
      }
     }
    }
   }
  }
 }
}