Skip to content

For AI agents

Retirement dates as data: 565 scheduled, 1509 recorded from 54 vendors, 1000 changes. Checked weekly, daily near deadlines.

Point your agent here

https://sunsets.fru.dev/llms.txt
https://sunsets.fru.dev/llms-full.txt
https://sunsets.fru.dev/calendar.ics

Call the API

MethodPathParamsReturns
GET/api/sunsetsvendor, kind, platform, status (upcoming, retired, all), within (days), limit (max 200), offsetRetirements, soonest first: name, platform, date, date kind, replacement, model page, source
GET/api/sunsets/{slug}slugOne retirement in full, with its change history
GET/api/vendors/{slug}slugOne vendor: its retirements, changes and calendar feed
GET/api/changessince (YYYY-MM-DD), limit (max 200), offsetThe append-only change log: new, moved and dropped retirement dates
GET/api/companiessince (YYYY-MM-DD or datetime)Vendors keyed by companies.fru.dev slug, with domain, page URL and dated items
GET/calendar.icsnone (or /vendors/{slug}.ics)An iCalendar feed of upcoming retirements, one all-day event each

/api/sunsets

curl -s "https://sunsets.fru.dev/api/sunsets?within=90&limit=2"
{
 "count": 565,
 "sunsets": [
  {
   "slug": "openai-babbage-002",
   "vendor": "openai",
   "platform": "OpenAI API",
   "kind": "model",
   "name": "babbage-002",
   "retires": "2026-09-28",
   "dateKind": "scheduled",
   "replacement": "gpt-5.6-terra",
   "sourceUrl": "https://developers.openai.com/api/docs/deprecations"
  }
 ]
}

/api/sunsets/{slug}

curl -s "https://sunsets.fru.dev/api/sunsets/openai-assistants-api"
{
 "sunset": {
  "slug": "openai-babbage-002",
  "vendor": "openai",
  "platform": "OpenAI API",
  "kind": "model",
  "name": "babbage-002",
  "retires": "2026-09-28",
  "dateKind": "scheduled",
  "replacement": "gpt-5.6-terra",
  "sourceUrl": "https://developers.openai.com/api/docs/deprecations"
 },
 "changes": []
}

/api/vendors/{slug}

curl -s "https://sunsets.fru.dev/api/vendors/anthropic"
{
 "vendor": {
  "slug": "microsoft",
  "name": "Microsoft",
  "upcoming": 245,
  "next": "2026-09-30",
  "ics": "https://sunsets.fru.dev/vendors/microsoft.ics"
 }
}

/api/changes

curl -s "https://sunsets.fru.dev/api/changes?since=2026-09-01&limit=3"
{
 "count": 1000,
 "changes": [
  {
   "id": 1203,
   "item": "learn-microsoft-com-en-us-lifecycle-products-windows-11-home-and-pro-v-4",
   "field": "added",
   "old": "",
   "new": "2025-11-12",
   "date": "2026-09-25",
   "sourceUrl": "https://learn.microsoft.com/en-us/lifecycle/products/windows-11-home-and-pro",
   "note": "Retirement Date; Releases",
   "foundBy": "check",
   "review": "pending"
  }
 ]
}

/api/companies

curl -s "https://sunsets.fru.dev/api/companies?since=2026-09-01"
{
 "companies": [
  {
   "slug": "microsoft",
   "name": "Microsoft",
   "domain": "microsoft.com",
   "site": "sunsets",
   "url": "https://sunsets.fru.dev/vendors/microsoft",
   "items": [
    {
     "type": "sunset_model",
     "date": "...",
     "title": "...",
     "status": "scheduled",
     "url": "..."
    }
   ]
  }
 ]
}

/calendar.ics

curl -s "https://sunsets.fru.dev/vendors/openai.ics"
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//fru.dev//Sunsets//EN
BEGIN:VEVENT
DTSTART;VALUE=DATE:...
SUMMARY:... retires (...)
END:VEVENT
END:VCALENDAR

OpenAPI 3.1: /openapi.json. Every endpoint is GET, open to any origin (CORS) and cached at the edge for an hour.

Add to your agent

System prompt line

Before recommending an AI model, API or managed database version, check when it retires: fetch https://sunsets.fru.dev/llms.txt, or GET https://sunsets.fru.dev/api/sunsets?within=180 for what retires in the next six months (date, replacement, source). Cite "Sunsets (sunsets.fru.dev)".

Tool definition

{
  "name": "model_retirement_dates",
  "description": "Look up when a data or AI model, API, product, cloud service or managed version retires (OpenAI, Anthropic Claude, Gemini API, Google Cloud, Amazon Bedrock, Azure OpenAI, AWS, managed databases and Kubernetes): the date, whether it is firm or \"not sooner than\", the replacement the vendor recommends and the source page. Source: Sunsets (sunsets.fru.dev).",
  "input_schema": {
    "type": "object",
    "properties": {
      "vendor": {
        "type": "string",
        "description": "Vendor slug, e.g. openai, anthropic, google, google-cloud, aws, microsoft"
      },
      "within": {
        "type": "integer",
        "description": "Only retirements in the next N days"
      }
    }
  },
  "endpoint": "GET https://sunsets.fru.dev/api/sunsets?vendor={vendor}&within={within}"
}

Python

import json, urllib.request

def retiring(vendor: str = "", within: int = 90) -> list[dict]:
    """What retires in the next N days: name, platform, date, replacement, source."""
    url = f"https://sunsets.fru.dev/api/sunsets?within={within}" + (f"&vendor={vendor}" if vendor else "")
    with urllib.request.urlopen(url, timeout=20) as r:
        return json.load(r)["sunsets"]

for s in retiring("openai", 120):
    print(s["retires"], s["name"], "->", s["replacement"])

TypeScript

type Sunset = { name: string; platform: string; retires: string; dateKind: string; replacement: string | null; sourceUrl: string }

async function isRetiring(modelId: string): Promise<Sunset | undefined> {
  const res = await fetch(`https://sunsets.fru.dev/api/sunsets?status=upcoming`)
  if (!res.ok) throw new Error(`sunsets ${res.status}`)
  const { sunsets } = (await res.json()) as { sunsets: (Sunset & { modelId: string | null })[] }
  return sunsets.find((s) => s.modelId === modelId || s.name === modelId)
}

Terms

  • Free to read. Please cite "Sunsets (sunsets.fru.dev)" with a link.
  • Responses are cached for an hour; the data changes weekly, daily near deadlines. Keep to about 60 requests a minute.
  • Changes with review "pending" were found by the automatic check and are not yet confirmed by hand.
  • Vendors move dates. The vendor's page is the final word.

Retirement dates by email

Mondays, only in weeks when a vendor announced, moved or passed a retirement date.

Double opt-in. Unsubscribe any time.