{"openapi":"3.1.0","info":{"title":"SunsetDiff API","version":"2026-10-23","summary":"Free static JSON, CSV, ICS, and RSS files of AI model shutdown dates. No API key.","description":"These are the static files documented at https://sunsetdiff.com/api/. They need no API key and no account. JSON and CSV dataset files are CC BY 4.0. Credit SunsetDiff and link the license. A null or blank field was not on the official page. Dataset version 2026-10-23. That date is the newest changelog date. The API index version string is v1.","license":{"name":"CC BY 4.0","url":"https://creativecommons.org/licenses/by/4.0/"}},"servers":[{"url":"https://sunsetdiff.com","description":"SunsetDiff"}],"security":[],"externalDocs":{"description":"Human-readable field list","url":"https://sunsetdiff.com/api/"},"paths":{"/data/models.json":{"get":{"operationId":"get_data_models_json","summary":"Full model records","description":"The model retirement dataset as one JSON object. License CC BY 4.0.\n\nCredit SunsetDiff and link the license when you copy this file.\n\nFields:\n- name: Fixed string: SunsetDiff model retirement dataset.\n- publisher: Fixed string: SunsetDiff.\n- license: https://creativecommons.org/licenses/by/4.0/\n- version: The newest changelog date, YYYY-MM-DD.\n- models: Full model record. status is active, legacy, deprecated, or retired. shutdown_date_kind is exact, not_before, month_only, or none. A null date or spec means the official page did not publish it.\n- models[].id: Provider model id, such as gpt-4o.\n- models[].slug: URL slug for the model page.\n- models[].provider: Provider id. See /api/v1/providers.json.\n- models[].display_name: Name shown on the site.\n- models[].family: Family name, or null.\n- models[].status: active, legacy, deprecated, or retired.\n- models[].announced_date: YYYY-MM-DD, or null when the page did not publish one.\n- models[].deprecation_date: YYYY-MM-DD, or null.\n- models[].shutdown_date: YYYY-MM-DD, or null.\n- models[].shutdown_date_kind: exact, not_before, month_only, or none. not_before is a floor, not a deadline.\n- models[].region_or_platform_notes: Scope note when the date does not apply everywhere, a release note, or a Sources disagree note when official pages list different shutdown dates. Null when none of those were published. shutdown_date stays the deprecations-page date when sources disagree.\n- models[].replacements: replacements[]: model_id, provider, kind, source_url. kind is official or editorial.\n- models[].sources: sources[]: url, label, last_checked, excerpt. last_checked is the day that page was read, YYYY-MM-DD.\n- models[].specs: specs object: input_price_per_mtok, output_price_per_mtok, cached_input_price_per_mtok, batch_discount_pct, currency, context_window_tokens, max_output_tokens, modalities_in, modalities_out, supports_tools, supports_json_schema, supports_vision, supports_streaming, supports_batch, supports_prompt_caching, reasoning, knowledge_cutoff, endpoints, specs_sources. Prices are USD per 1M tokens when published. specs_sources maps a spec field to { url, last_checked }.\n- models[].first_seen: ISO-8601 timestamp when the record was first stored.\n- models[].updated_at: ISO-8601 timestamp when the record last changed.","security":[],"parameters":[],"responses":{"200":{"description":"The model retirement dataset as one JSON object. License CC BY 4.0.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"name: Fixed string: SunsetDiff model retirement dataset. publisher: Fixed string: SunsetDiff. license: https://creativecommons.org/licenses/by/4.0/ version: The newest changelog date, YYYY-MM-DD. models: Full model record. status is active, legacy, deprecated, or retired. shutdown_date_kind is exact, not_before, month_only, or none. A null date or spec means the official page did not publish it. models[].id: Provider model id, such as gpt-4o. models[].slug: URL slug for the model page. models[].provider: Provider id. See /api/v1/providers.json. models[].display_name: Name shown on the site. models[].family: Family name, or null. models[].status: active, legacy, deprecated, or retired. models[].announced_date: YYYY-MM-DD, or null when the page did not publish one. models[].deprecation_date: YYYY-MM-DD, or null. models[].shutdown_date: YYYY-MM-DD, or null. models[].shutdown_date_kind: exact, not_before, month_only, or none. not_before is a floor, not a deadline. models[].region_or_platform_notes: Scope note when the date does not apply everywhere, a release note, or a Sources disagree note when official pages list different shutdown dates. Null when none of those were published. shutdown_date stays the deprecations-page date when sources disagree. models[].replacements: replacements[]: model_id, provider, kind, source_url. kind is official or editorial. models[].sources: sources[]: url, label, last_checked, excerpt. last_checked is the day that page was read, YYYY-MM-DD. models[].specs: specs object: input_price_per_mtok, output_price_per_mtok, cached_input_price_per_mtok, batch_discount_pct, currency, context_window_tokens, max_output_tokens, modalities_in, modalities_out, supports_tools, supports_json_schema, supports_vision, supports_streaming, supports_batch, supports_prompt_caching, reasoning, knowledge_cutoff, endpoints, specs_sources. Prices are USD per 1M tokens when published. specs_sources maps a spec field to { url, last_checked }. models[].first_seen: ISO-8601 timestamp when the record was first stored. models[].updated_at: ISO-8601 timestamp when the record last changed."}}}}}}},"/data/deprecations.csv":{"get":{"operationId":"get_data_deprecations_csv","summary":"Deprecating and retired rows","description":"One row per model that is not active, has a dated shutdown, or has a deprecation date. License CC BY 4.0.\n\nQuoted CSV. A blank cell was not on the official page.\n\nFields:\n- provider: Same meaning as the model record field. Empty when the official page did not publish it.\n- id: Same meaning as the model record field. Empty when the official page did not publish it.\n- slug: Same meaning as the model record field. Empty when the official page did not publish it.\n- display_name: Same meaning as the model record field. Empty when the official page did not publish it.\n- status: Same meaning as the model record field. Empty when the official page did not publish it.\n- announced_date: Same meaning as the model record field. Empty when the official page did not publish it.\n- deprecation_date: Same meaning as the model record field. Empty when the official page did not publish it.\n- shutdown_date: Same meaning as the model record field. Empty when the official page did not publish it.\n- shutdown_date_kind: Same meaning as the model record field. Empty when the official page did not publish it.\n- replacement_id: Official replacement model id when one is marked official. Otherwise the first replacement. Empty when none is listed.\n- replacement_provider: Provider id of that replacement. Empty when replacement_id is empty.\n- source_url: First official source URL on the record.\n- last_checked: Day that source was read, YYYY-MM-DD.","security":[],"parameters":[],"responses":{"200":{"description":"One row per model that is not active, has a dated shutdown, or has a deprecation date. License CC BY 4.0.","content":{"text/csv":{"schema":{"type":"string"}}}}}}},"/data/changelog.json":{"get":{"operationId":"get_data_changelog_json","summary":"Changelog","description":"Versioned field changes recorded from official pages. License CC BY 4.0.\n\nA version group is every change recorded on that calendar date.\n\nFields:\n- name: Fixed string: SunsetDiff model retirement dataset.\n- publisher: Fixed string: SunsetDiff.\n- license: https://creativecommons.org/licenses/by/4.0/\n- version: Date of the newest version group, YYYY-MM-DD.\n- versions: Array of { version, changes }, oldest first.\n- versions[].version: The change date, YYYY-MM-DD.\n- versions[].changes: Each change has provider, model_id, field, old, new, source_url. old and new are the recorded values. source_url is the official page.","security":[],"parameters":[],"responses":{"200":{"description":"Versioned field changes recorded from official pages. License CC BY 4.0.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"name: Fixed string: SunsetDiff model retirement dataset. publisher: Fixed string: SunsetDiff. license: https://creativecommons.org/licenses/by/4.0/ version: Date of the newest version group, YYYY-MM-DD. versions: Array of { version, changes }, oldest first. versions[].version: The change date, YYYY-MM-DD. versions[].changes: Each change has provider, model_id, field, old, new, source_url. old and new are the recorded values. source_url is the official page."}}}}}}},"/data/breaking-changes.json":{"get":{"operationId":"get_data_breaking_changes_json","summary":"Request breaking changes","description":"One rule per row for a request setting or endpoint a replacement model rejects, or for an API version that rejects a setting on every model. License CC BY 4.0. error_text is null when the cited page does not print a sentence. scope and api_version are omitted on model-scoped rows.\n\nThe human page is /breaking-changes/.\n\nRetired model ids are on /errors/, not in this file.\n\nCredit SunsetDiff and link the license when you copy this file.\n\nFields:\n- name: Fixed string: SunsetDiff request breaking changes.\n- publisher: Fixed string: SunsetDiff.\n- license: https://creativecommons.org/licenses/by/4.0/\n- description: What the file contains.\n- version: The newest rules[].checked date, YYYY-MM-DD.\n- rules: One object per breaking change.\n- rules[].id: Stable id. The hub links to /breaking-changes/#id.\n- rules[].provider: Provider id. See /api/v1/providers.json.\n- rules[].provider_name: Provider name shown on the site.\n- rules[].model_family: Family label from the source, or null.\n- rules[].models: Models this rule is shown for. Each item has id, provider, slug, and role.\n- rules[].models[].role: rejects means this id fails the old setting. switch_from means a switch guide leaves this id for a model that fails it.\n- rules[].old_setting: The request field, value, or endpoint the old call sent.\n- rules[].what_happens: What the cited page says happens now.\n- rules[].error_text: Exact sentence from source_url or quote_source_url. Null when neither page prints one.\n- rules[].fix: The change the cited page tells you to make.\n- rules[].source_url: Official page or public GitHub issue the row is taken from.\n- rules[].source_label: Short name for that page.\n- rules[].quote_source_url: Page that prints error_text, when it is not source_url. Null otherwise.\n- rules[].quote_source_label: Short name for quote_source_url, or null.\n- rules[].checked: Day the source was read, YYYY-MM-DD.\n- rules[].error_page: SunsetDiff /errors/ path, or null when this rule has no error page.\n- rules[].migrations: Switch guides this rule applies to. Each item has href and label.\n- rules[].citations: Every URL read for the row, including source_url.\n- rules[].scope: Optional. api_version when the rule follows an API version instead of one model id. Omitted on model-scoped rows.\n- rules[].api_version: Optional. The API version string, such as 2026-10-21, when scope is api_version. Omitted on model-scoped rows.","security":[],"parameters":[],"responses":{"200":{"description":"One rule per row for a request setting or endpoint a replacement model rejects, or for an API version that rejects a setting on every model. License CC BY 4.0. error_text is null when the cited page does not print a sentence. scope and api_version are omitted on model-scoped rows.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"name: Fixed string: SunsetDiff request breaking changes. publisher: Fixed string: SunsetDiff. license: https://creativecommons.org/licenses/by/4.0/ description: What the file contains. version: The newest rules[].checked date, YYYY-MM-DD. rules: One object per breaking change. rules[].id: Stable id. The hub links to /breaking-changes/#id. rules[].provider: Provider id. See /api/v1/providers.json. rules[].provider_name: Provider name shown on the site. rules[].model_family: Family label from the source, or null. rules[].models: Models this rule is shown for. Each item has id, provider, slug, and role. rules[].models[].role: rejects means this id fails the old setting. switch_from means a switch guide leaves this id for a model that fails it. rules[].old_setting: The request field, value, or endpoint the old call sent. rules[].what_happens: What the cited page says happens now. rules[].error_text: Exact sentence from source_url or quote_source_url. Null when neither page prints one. rules[].fix: The change the cited page tells you to make. rules[].source_url: Official page or public GitHub issue the row is taken from. rules[].source_label: Short name for that page. rules[].quote_source_url: Page that prints error_text, when it is not source_url. Null otherwise. rules[].quote_source_label: Short name for quote_source_url, or null. rules[].checked: Day the source was read, YYYY-MM-DD. rules[].error_page: SunsetDiff /errors/ path, or null when this rule has no error page. rules[].migrations: Switch guides this rule applies to. Each item has href and label. rules[].citations: Every URL read for the row, including source_url. rules[].scope: Optional. api_version when the rule follows an API version instead of one model id. Omitted on model-scoped rows. rules[].api_version: Optional. The API version string, such as 2026-10-21, when scope is api_version. Omitted on model-scoped rows."}}}}}}},"/data/breaking-changes.csv":{"get":{"operationId":"get_data_breaking_changes_csv","summary":"Request breaking changes CSV","description":"The same breaking-change rules as breaking-changes.json, one row each. License CC BY 4.0.\n\nQuoted CSV. An empty error_text cell means the source did not print a sentence.\n\nFields:\n- id: Same meaning as the matching field in /data/breaking-changes.json.\n- provider: Same meaning as the matching field in /data/breaking-changes.json.\n- provider_name: Same meaning as the matching field in /data/breaking-changes.json.\n- model_family: Family label from the source. Empty when the source names only specific ids and this row left the family blank.\n- model_ids: Models that reject the old setting, as provider:id, separated by a semicolon.\n- switch_from_model_ids: Model ids you switch away from, as provider:id, separated by a semicolon. Empty when the rule has none.\n- old_setting: Same meaning as the matching field in /data/breaking-changes.json.\n- what_happens: Same meaning as the matching field in /data/breaking-changes.json.\n- error_text: Exact quoted sentence. Empty when the source does not print one.\n- fix: Same meaning as the matching field in /data/breaking-changes.json.\n- source_url: Same meaning as the matching field in /data/breaking-changes.json.\n- source_label: Same meaning as the matching field in /data/breaking-changes.json.\n- quote_source_url: Page that prints error_text, when it is not source_url. Empty otherwise.\n- checked: Same meaning as the matching field in /data/breaking-changes.json.\n- error_page: SunsetDiff /errors/ path. Empty when this rule has no error page.\n- migrations: Switch guide paths, separated by a semicolon.\n- citations: Source URLs separated by spaces.\n- scope: api_version when the rule follows an API version. Empty on model-scoped rows.\n- api_version: API version string, such as 2026-10-21. Empty on model-scoped rows.","security":[],"parameters":[],"responses":{"200":{"description":"The same breaking-change rules as breaking-changes.json, one row each. License CC BY 4.0.","content":{"text/csv":{"schema":{"type":"string"}}}}}}},"/dataset/sunsetdiff.json":{"get":{"operationId":"get_dataset_sunsetdiff_json","summary":"Dataset snapshot","description":"Providers, full model records, and migration diffs in one file. License CC BY 4.0.\n\nThis file is the snapshot named on the dataset page.\n\nFields:\n- generated_at: ISO-8601 time when this file was written.\n- providers: Provider records: id, name, deprecations_url, pricing_url, models_url.\n- models: Full model record. status is active, legacy, deprecated, or retired. shutdown_date_kind is exact, not_before, month_only, or none. A null date or spec means the official page did not publish it.\n- migrations: Migration diffs: from, to, price_diff, context_diff, max_output_diff, capability_changes, api_changes, code_change, migration_checklist, confidence, last_checked, sources. from and to are { provider, model_id, slug }.\n- migrations[].price_diff: input_pct_change, output_pct_change, example_monthly_cost_old, example_monthly_cost_new, currency (USD), example_label. Null percents mean a price was not published.\n- migrations[].context_diff: old_tokens, new_tokens, change_pct.\n- migrations[].max_output_diff: old_tokens, new_tokens, change_pct.\n- migrations[].capability_changes: Array of { field, old, new } for capability fields that differ.\n- migrations[].api_changes: Array of { kind, detail, source_url }. kind is renamed_param, removed_param, new_required_param, endpoint_change, or behavior_change.\n- migrations[].code_change: language plus before/after, and snippets.python, snippets.typescript, and snippets.curl, each with before and after.\n- migrations[].migration_checklist: Non-empty list of steps.\n- migrations[].confidence: official or partial.\n- migrations[].last_checked: YYYY-MM-DD.\n- migrations[].sources: sources[]: url, label, last_checked, excerpt. last_checked is the day that page was read, YYYY-MM-DD.","security":[],"parameters":[],"responses":{"200":{"description":"Providers, full model records, and migration diffs in one file. License CC BY 4.0.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"generated_at: ISO-8601 time when this file was written. providers: Provider records: id, name, deprecations_url, pricing_url, models_url. models: Full model record. status is active, legacy, deprecated, or retired. shutdown_date_kind is exact, not_before, month_only, or none. A null date or spec means the official page did not publish it. migrations: Migration diffs: from, to, price_diff, context_diff, max_output_diff, capability_changes, api_changes, code_change, migration_checklist, confidence, last_checked, sources. from and to are { provider, model_id, slug }. migrations[].price_diff: input_pct_change, output_pct_change, example_monthly_cost_old, example_monthly_cost_new, currency (USD), example_label. Null percents mean a price was not published. migrations[].context_diff: old_tokens, new_tokens, change_pct. migrations[].max_output_diff: old_tokens, new_tokens, change_pct. migrations[].capability_changes: Array of { field, old, new } for capability fields that differ. migrations[].api_changes: Array of { kind, detail, source_url }. kind is renamed_param, removed_param, new_required_param, endpoint_change, or behavior_change. migrations[].code_change: language plus before/after, and snippets.python, snippets.typescript, and snippets.curl, each with before and after. migrations[].migration_checklist: Non-empty list of steps. migrations[].confidence: official or partial. migrations[].last_checked: YYYY-MM-DD. migrations[].sources: sources[]: url, label, last_checked, excerpt. last_checked is the day that page was read, YYYY-MM-DD."}}}}}}},"/dataset/sunsetdiff.csv":{"get":{"operationId":"get_dataset_sunsetdiff_csv","summary":"Compact dataset CSV","description":"One row per model, with the shutdown date, replacement id, and source. License CC BY 4.0.\n\nHeader order matches the compact JSON keys.\n\nFields:\n- id: Same meaning as the compact JSON row in /api/v1/models.json.\n- slug: Same meaning as the compact JSON row in /api/v1/models.json.\n- provider: Same meaning as the compact JSON row in /api/v1/models.json.\n- display_name: Same meaning as the compact JSON row in /api/v1/models.json.\n- status: Same meaning as the compact JSON row in /api/v1/models.json.\n- shutdown_date: Same meaning as the compact JSON row in /api/v1/models.json.\n- shutdown_date_kind: Same meaning as the compact JSON row in /api/v1/models.json.\n- replacement: First replacement model id, or empty.\n- source_url: Same meaning as the compact JSON row in /api/v1/models.json.\n- last_checked: Same meaning as the compact JSON row in /api/v1/models.json.","security":[],"parameters":[],"responses":{"200":{"description":"One row per model, with the shutdown date, replacement id, and source. License CC BY 4.0.","content":{"text/csv":{"schema":{"type":"string"}}}}}}},"/feed.xml":{"get":{"operationId":"get_feed_xml","summary":"Deprecations RSS","description":"RSS 2.0 feed of shutdown batches and recorded deprecation changes.\n\nThe feed keeps the latest 100 deprecation-field changes (shutdown_date, deprecation_date, announced_date, status), plus one item per shutdown batch.\n\nFields:\n- channel title: SunsetDiff new deprecations.\n- channel link: The deadlines page.\n- item title: A shutdown batch title, or model id plus the field that changed.\n- item link: The SunsetDiff page for that batch or model. A change with no model page links to the official source.\n- item guid: The page URL for a batch, or date:provider:model id:field for a change.\n- item pubDate: The batch date or the change date, as an RSS date.\n- item description: The batch lead, or the field's new and previous values plus the source URL.","security":[],"parameters":[],"responses":{"200":{"description":"RSS 2.0 feed of shutdown batches and recorded deprecation changes.","content":{"application/rss+xml":{"schema":{"type":"string"}}}}}}},"/deadlines.ics":{"get":{"operationId":"get_deadlines_ics","summary":"Deadline calendar","description":"iCalendar of shutdowns in the next 365 days. not_before floors are left out.\n\nSubscribe to this URL in a calendar app. /calendar.ics is a separate file and includes not_before floors.\n\nFields:\n- UID: provider-slug@sunsetdiff.\n- DTSTART: All-day date of shutdown_date.\n- SUMMARY: Model id plus shutdown, or shutdown month when the kind is month_only.\n- DESCRIPTION: Official source URL, the day it was checked, and the status.\n- URL: The SunsetDiff model page.","security":[],"parameters":[],"responses":{"200":{"description":"iCalendar of shutdowns in the next 365 days. not_before floors are left out.","content":{"text/calendar":{"schema":{"type":"string"}}}}}}},"/api/v1/index.json":{"get":{"operationId":"get_api_v1_index_json","summary":"API index","description":"Counts and links to the other static files.\n\nThe dataset license in public/DATA_LICENSE.txt covers the JSON and CSV files under /api/v1.\n\nFields:\n- version: Fixed string v1.\n- generated_at: ISO-8601 time when the files were written.\n- counts.models: Number of model records.\n- counts.migrations: Number of migration diffs.\n- counts.providers: Number of providers.\n- links: Relative paths to providers, models, upcoming, changes, schema, the dataset files, deadlines.ics, and feed.xml.","security":[],"parameters":[],"responses":{"200":{"description":"Counts and links to the other static files.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"version: Fixed string v1. generated_at: ISO-8601 time when the files were written. counts.models: Number of model records. counts.migrations: Number of migration diffs. counts.providers: Number of providers. links: Relative paths to providers, models, upcoming, changes, schema, the dataset files, deadlines.ics, and feed.xml."}}}}}}},"/api/v1/providers.json":{"get":{"operationId":"get_api_v1_providers_json","summary":"Providers","description":"The provider list, including each official deprecations URL.\n\nFields:\n- id: Stable provider id used in model records and URLs.\n- name: Official page for that topic.\n- deprecations_url: Official page the dates are read from.\n- pricing_url: Official page for that topic.\n- models_url: Official page for that topic.","security":[],"parameters":[],"responses":{"200":{"description":"The provider list, including each official deprecations URL.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"id: Stable provider id used in model records and URLs. name: Official page for that topic. deprecations_url: Official page the dates are read from. pricing_url: Official page for that topic. models_url: Official page for that topic."}}}}}}}},"/api/v1/models.json":{"get":{"operationId":"get_api_v1_models_json","summary":"Compact model list","description":"Every model as a short row: status, shutdown, replacement, and source.\n\nFields:\n- id: See the full record in /data/models.json. source_url and last_checked come from the first source.\n- slug: See the full record in /data/models.json. source_url and last_checked come from the first source.\n- provider: See the full record in /data/models.json. source_url and last_checked come from the first source.\n- display_name: See the full record in /data/models.json. source_url and last_checked come from the first source.\n- status: See the full record in /data/models.json. source_url and last_checked come from the first source.\n- shutdown_date: See the full record in /data/models.json. source_url and last_checked come from the first source.\n- shutdown_date_kind: See the full record in /data/models.json. source_url and last_checked come from the first source.\n- replacement: First replacement model id, or null.\n- source_url: See the full record in /data/models.json. source_url and last_checked come from the first source.\n- last_checked: See the full record in /data/models.json. source_url and last_checked come from the first source.","security":[],"parameters":[],"responses":{"200":{"description":"Every model as a short row: status, shutdown, replacement, and source.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"id: See the full record in /data/models.json. source_url and last_checked come from the first source. slug: See the full record in /data/models.json. source_url and last_checked come from the first source. provider: See the full record in /data/models.json. source_url and last_checked come from the first source. display_name: See the full record in /data/models.json. source_url and last_checked come from the first source. status: See the full record in /data/models.json. source_url and last_checked come from the first source. shutdown_date: See the full record in /data/models.json. source_url and last_checked come from the first source. shutdown_date_kind: See the full record in /data/models.json. source_url and last_checked come from the first source. replacement: First replacement model id, or null. source_url: See the full record in /data/models.json. source_url and last_checked come from the first source. last_checked: See the full record in /data/models.json. source_url and last_checked come from the first source."}}}}}}}},"/api/v1/upcoming.json":{"get":{"operationId":"get_api_v1_upcoming_json","summary":"Upcoming shutdowns","description":"Compact rows whose shutdown date falls in the next 90 days, soonest first.\n\nnot_before floors and rows with shutdown_date_kind none are omitted. month_only rows are included when that month overlaps the window.\n\nFields:\n- id: Same fields as /api/v1/models.json.\n- slug: Same fields as /api/v1/models.json.\n- provider: Same fields as /api/v1/models.json.\n- display_name: Same fields as /api/v1/models.json.\n- status: Same fields as /api/v1/models.json.\n- shutdown_date: Same fields as /api/v1/models.json.\n- shutdown_date_kind: Same fields as /api/v1/models.json.\n- replacement: Same fields as /api/v1/models.json.\n- source_url: Same fields as /api/v1/models.json.\n- last_checked: Same fields as /api/v1/models.json.","security":[],"parameters":[],"responses":{"200":{"description":"Compact rows whose shutdown date falls in the next 90 days, soonest first.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"id: Same fields as /api/v1/models.json. slug: Same fields as /api/v1/models.json. provider: Same fields as /api/v1/models.json. display_name: Same fields as /api/v1/models.json. status: Same fields as /api/v1/models.json. shutdown_date: Same fields as /api/v1/models.json. shutdown_date_kind: Same fields as /api/v1/models.json. replacement: Same fields as /api/v1/models.json. source_url: Same fields as /api/v1/models.json. last_checked: Same fields as /api/v1/models.json."}}}}}}}},"/api/v1/changes.json":{"get":{"operationId":"get_api_v1_changes_json","summary":"Recent changes","description":"The last 500 recorded field changes.\n\nFields:\n- date: See the changelog for the same facts grouped by date.\n- provider: See the changelog for the same facts grouped by date.\n- model_id: See the changelog for the same facts grouped by date.\n- field: See the changelog for the same facts grouped by date.\n- old: The value before or after the change. Shape depends on the field.\n- new: The value before or after the change. Shape depends on the field.\n- source_url: See the changelog for the same facts grouped by date.","security":[],"parameters":[],"responses":{"200":{"description":"The last 500 recorded field changes.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"date: See the changelog for the same facts grouped by date. provider: See the changelog for the same facts grouped by date. model_id: See the changelog for the same facts grouped by date. field: See the changelog for the same facts grouped by date. old: The value before or after the change. Shape depends on the field. new: The value before or after the change. Shape depends on the field. source_url: See the changelog for the same facts grouped by date."}}}}}}}},"/api/v1/schema.json":{"get":{"operationId":"get_api_v1_schema_json","summary":"JSON Schema","description":"JSON Schema for a model, a provider, and a migration.\n\nGenerated from the same Zod schemas the scrapers validate against.\n\nFields:\n- model: JSON Schema for one model record.\n- provider: JSON Schema for one provider.\n- migration: JSON Schema for one migration diff.","security":[],"parameters":[],"responses":{"200":{"description":"JSON Schema for a model, a provider, and a migration.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"model: JSON Schema for one model record. provider: JSON Schema for one provider. migration: JSON Schema for one migration diff."}}}}}}},"/api/v1/models/{provider}/{slug}.json":{"get":{"operationId":"get_api_v1_models_provider_slug_json","summary":"One model","description":"The full model record for that provider and slug.\n\nExample: /api/v1/models/openai/gpt-4o.json when that slug is in the dataset.\n\nFields:\n- id: Full model record field. See /data/models.json.\n- slug: Full model record field. See /data/models.json.\n- provider: Full model record field. See /data/models.json.\n- display_name: Full model record field. See /data/models.json.\n- family: Full model record field. See /data/models.json.\n- status: Full model record field. See /data/models.json.\n- announced_date: Full model record field. See /data/models.json.\n- deprecation_date: Full model record field. See /data/models.json.\n- shutdown_date: Full model record field. See /data/models.json.\n- shutdown_date_kind: Full model record field. See /data/models.json.\n- region_or_platform_notes: Full model record field. See /data/models.json.\n- replacements: Full model record field. See /data/models.json.\n- sources: Full model record field. See /data/models.json.\n- specs: Full model record field. See /data/models.json.\n- first_seen: Full model record field. See /data/models.json.\n- updated_at: Full model record field. See /data/models.json.","security":[],"parameters":[{"name":"provider","in":"path","required":true,"description":"Provider id. The ids are listed in /api/v1/providers.json.","schema":{"type":"string"}},{"name":"slug","in":"path","required":true,"description":"Model URL slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"The full model record for that provider and slug.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"id: Full model record field. See /data/models.json. slug: Full model record field. See /data/models.json. provider: Full model record field. See /data/models.json. display_name: Full model record field. See /data/models.json. family: Full model record field. See /data/models.json. status: Full model record field. See /data/models.json. announced_date: Full model record field. See /data/models.json. deprecation_date: Full model record field. See /data/models.json. shutdown_date: Full model record field. See /data/models.json. shutdown_date_kind: Full model record field. See /data/models.json. region_or_platform_notes: Full model record field. See /data/models.json. replacements: Full model record field. See /data/models.json. sources: Full model record field. See /data/models.json. specs: Full model record field. See /data/models.json. first_seen: Full model record field. See /data/models.json. updated_at: Full model record field. See /data/models.json."}}}}}}},"/api/v1/lookup/{model-id}.json":{"get":{"operationId":"get_api_v1_lookup_model_id_json","summary":"Lookup by model id","description":"The model record for that id. If several providers use the same id, the file is an array of records.\n\nThe filename is the model id. Characters that are not safe in a URL are percent-encoded.\n\nFields:\n- (model or array): One model record, or an array of model records that share the id.","security":[],"parameters":[{"name":"model-id","in":"path","required":true,"description":"Model id. Characters that are not safe in a URL are percent-encoded in the filename.","schema":{"type":"string"}}],"responses":{"200":{"description":"The model record for that id. If several providers use the same id, the file is an array of records.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":true,"description":"One model record when a single provider uses this id."},{"type":"array","items":{"type":"object","additionalProperties":true},"description":"One model record per provider when several providers use this id."}]}}}}}}},"/api/v1/migrations/{from-provider}__{from-slug}__to__{to-provider}__{to-slug}.json":{"get":{"operationId":"get_api_v1_migrations_from_provider_from_slug_to_to_provider_to_slug_json","summary":"One migration diff","description":"The price, context, capability, API, and code diff for one replacement pair.\n\nThe file exists when both models are in the dataset and a migration was generated.\n\nFields:\n- from: See /dataset/sunsetdiff.json migrations.\n- to: See /dataset/sunsetdiff.json migrations.\n- price_diff: See /dataset/sunsetdiff.json migrations.\n- context_diff: See /dataset/sunsetdiff.json migrations.\n- max_output_diff: See /dataset/sunsetdiff.json migrations.\n- capability_changes: See /dataset/sunsetdiff.json migrations.\n- api_changes: See /dataset/sunsetdiff.json migrations.\n- code_change: See /dataset/sunsetdiff.json migrations.\n- migration_checklist: See /dataset/sunsetdiff.json migrations.\n- confidence: See /dataset/sunsetdiff.json migrations.\n- last_checked: See /dataset/sunsetdiff.json migrations.\n- sources: See /dataset/sunsetdiff.json migrations.","security":[],"parameters":[{"name":"from-provider","in":"path","required":true,"description":"Provider id. The ids are listed in /api/v1/providers.json.","schema":{"type":"string"}},{"name":"from-slug","in":"path","required":true,"description":"Model URL slug.","schema":{"type":"string"}},{"name":"to-provider","in":"path","required":true,"description":"Provider id. The ids are listed in /api/v1/providers.json.","schema":{"type":"string"}},{"name":"to-slug","in":"path","required":true,"description":"Model URL slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"The price, context, capability, API, and code diff for one replacement pair.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"from: See /dataset/sunsetdiff.json migrations. to: See /dataset/sunsetdiff.json migrations. price_diff: See /dataset/sunsetdiff.json migrations. context_diff: See /dataset/sunsetdiff.json migrations. max_output_diff: See /dataset/sunsetdiff.json migrations. capability_changes: See /dataset/sunsetdiff.json migrations. api_changes: See /dataset/sunsetdiff.json migrations. code_change: See /dataset/sunsetdiff.json migrations. migration_checklist: See /dataset/sunsetdiff.json migrations. confidence: See /dataset/sunsetdiff.json migrations. last_checked: See /dataset/sunsetdiff.json migrations. sources: See /dataset/sunsetdiff.json migrations."}}}}}}},"/calendar.ics":{"get":{"operationId":"get_calendar_ics","summary":"All shutdown dates","description":"iCalendar of every model with a shutdown date, including not_before floors.\n\nPer-provider files are /calendar/<provider>.ics. For the next 365 days without floors, use /deadlines.ics.\n\nFields:\n- SUMMARY: Model id plus shutdown, or 'not before this date' when the kind is not_before.\n- DESCRIPTION: The official source URL.\n- URL: The SunsetDiff model page.","security":[],"parameters":[],"responses":{"200":{"description":"iCalendar of every model with a shutdown date, including not_before floors.","content":{"text/calendar":{"schema":{"type":"string"}}}}}}},"/changes.xml":{"get":{"operationId":"get_changes_xml","summary":"Changes RSS","description":"The latest 100 recorded field changes, newest first.\n\nfeed.xml is the deprecations feed. This file is the raw change log.\n\nFields:\n- item title: provider, model id, and field.\n- item link: The official source URL for that change.\n- item description: field, previous value, and new value.","security":[],"parameters":[],"responses":{"200":{"description":"The latest 100 recorded field changes, newest first.","content":{"application/rss+xml":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"operationId":"get_llms_txt","summary":"LLM site index","description":"A short index of SunsetDiff pages, the dataset links, and the soonest shutdowns.\n\n/llms-full.txt is a tab-separated model table: id, provider, status, shutdown date, official replacement, input price, output price, context tokens, max output tokens, source, last checked.\n\nFields:\n- text: Markdown-style links. Publisher line says SunsetDiff.","security":[],"parameters":[],"responses":{"200":{"description":"A short index of SunsetDiff pages, the dataset links, and the soonest shutdowns.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/search-index.json":{"get":{"operationId":"get_search_index_json","summary":"Search index","description":"Short rows the on-site search box uses.\n\nFields:\n- id: Model id.\n- provider: Provider id.\n- slug: URL slug.\n- display_name: Display name.\n- status: active, legacy, deprecated, or retired.","security":[],"parameters":[],"responses":{"200":{"description":"Short rows the on-site search box uses.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"id: Model id. provider: Provider id. slug: URL slug. display_name: Display name. status: active, legacy, deprecated, or retired."}}}}}}}}}}