For AI agents
Retirement dates as data: 1720 recorded so far from 69 vendors, +150 in the last 30 days, 1000 changes. New products found daily; each row carries its source and first-seen date.
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; each row has a url, the page that shows it, and a title, the name that page shows |
| GET | /api/sources | since (YYYY-MM-DD), limit (max 200), offset | Every page Sunsets reads, newest first: kind, how it was found, first seen, dates it yields |
| 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": 558,
"sunsets": [
{
"slug": "azure-functions-net",
"vendor": "microsoft",
"platform": "Azure Functions",
"kind": "runtime",
"name": ".NET",
"retires": "2026-11-10",
"dateKind": "scheduled",
"replacement": null,
"sourceUrl": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-versions"
}
]
}/api/sunsets/{slug}
curl -s "https://sunsets.fru.dev/api/sunsets/openai-assistants-api"{
"sunset": {
"slug": "azure-functions-net",
"vendor": "microsoft",
"platform": "Azure Functions",
"kind": "runtime",
"name": ".NET",
"retires": "2026-11-10",
"dateKind": "scheduled",
"replacement": null,
"sourceUrl": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-versions"
},
"changes": []
}/api/vendors/{slug}
curl -s "https://sunsets.fru.dev/api/vendors/anthropic"{
"vendor": {
"slug": "microsoft",
"name": "Microsoft",
"upcoming": 211,
"next": "2026-11-10",
"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": 1584,
"item": "postgresql-postgresql-17",
"field": "added",
"old": "",
"new": "2029-11-08",
"date": "2026-11-09",
"sourceUrl": "https://endoflife.date/postgresql",
"note": "End of support for version 17",
"foundBy": "check",
"review": "pending"
}
]
}/api/sources
curl -s "https://sunsets.fru.dev/api/sources?limit=3"{
"count": 172,
"sources": [
{
"url": "https://community.qlik.com/t5/Product-Lifecycle/Qlik-Sense-Enterprise-on-Windows-Product-Lifecycle/ta-p/1826335/highlight/true/show-comments/true/page/2",
"key": "community-qlik-com-t5-product-lifecycle-qlik-sense-enterprise-on-windows-product",
"label": "Qlik Sense Enterprise on Windows Product Lifecycle",
"vendor": "qlik",
"kind": "probe",
"parser": "table",
"foundBy": "link",
"firstSeen": "2026-11-09",
"lastOk": "2026-11-09",
"yield": 10,
"state": "active"
}
]
}/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.