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.txthttps://sunsets.fru.dev/llms-full.txthttps://sunsets.fru.dev/calendar.icsCall the API
| Method | Path | Params | Returns |
|---|---|---|---|
| GET | /api/sunsets | vendor, kind, platform, status (upcoming, retired, all), within (days), limit (max 200), offset | Retirements, soonest first: name, platform, date, date kind, replacement, model page, source |
| GET | /api/sunsets/{slug} | slug | One retirement in full, with its change history |
| GET | /api/vendors/{slug} | slug | One vendor: its retirements, changes and calendar feed |
| GET | /api/changes | since (YYYY-MM-DD), limit (max 200), offset | The append-only change log: new, moved and dropped retirement dates |
| GET | /api/companies | since (YYYY-MM-DD or datetime) | Vendors keyed by companies.fru.dev slug, with domain, page URL and dated items |
| GET | /calendar.ics | none (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:VCALENDAROpenAPI 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.