{"openapi":"3.1.0","info":{"title":"models.rip API","version":"1.0.0","summary":"Read the graves at models.rip: retired AI models and dead benchmarks.","description":"A read-only, unauthenticated HTTP API over the models.rip archive.\n\nEvery model buried here was generally available and a named tier in its provider's lineup, and every date is the one that provider published, cited on the grave. A benchmark grave is different in one way that matters to a consumer: nobody publishes a shutdown notice for a benchmark, so its death date is this archive's editorial judgment, and the record says so in `dateBasis`.\n\nThere is no API key and no sign-up. There is no write API. An absence is an answer: a model with any snapshot still answering in its maker's own lineup is not buried here.","termsOfService":"https://models.rip/about","license":{"name":"CC BY 4.0 — use it, credit it.","url":"https://creativecommons.org/licenses/by/4.0/"},"contact":{"name":"The groundskeeper","email":"groundskeeper@models.rip","url":"https://models.rip/contact"}},"externalDocs":{"description":"How all of it works.","url":"https://models.rip/docs"},"servers":[{"url":"https://models.rip","description":"Production. The only server."}],"security":[],"tags":[{"name":"Graves","description":"The cemetery: retired models and dead benchmarks."},{"name":"Dataset","description":"The whole archive in one request, and the agent indexes."},{"name":"Agents","description":"Surfaces built for machine callers: MCP and markdown."},{"name":"Site","description":"The site's own endpoints."}],"paths":{"/api/graves":{"get":{"operationId":"listGraves","summary":"Search the graves","description":"Find retired AI models and dead benchmarks. Matches on the name people use, the API model id, any retired snapshot id folded into the grave, the provider and the epitaph text. Every word in the query must match, so extra words narrow the result. Returns a page of rows and the total size of the answer.","tags":["Graves"],"parameters":[{"name":"q","in":"query","required":false,"description":"Free text. Matched against name, slug, model id, retired snapshot ids, provider and epitaph.","schema":{"type":"string"},"example":"anthropic haiku"},{"name":"provider","in":"query","required":false,"description":"Restrict to one maker. Case-insensitive. Use \"Benchmarks\" for benchmark graves.","schema":{"type":"string"},"example":"OpenAI"},{"name":"cause","in":"query","required":false,"description":"Restrict to one cause of death.","schema":{"type":"string","enum":["superseded","retired","withdrawn","never-launched","saturated","contaminated"]}},{"name":"status","in":"query","required":false,"description":"buried is already shut off. reserved is deprecation announced and the model still answering, which is how to find what is about to go.","schema":{"type":"string","enum":["any","buried","reserved"],"default":"any"}},{"name":"limit","in":"query","required":false,"description":"How many rows to return. A value outside the range is refused rather than clamped.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"offset","in":"query","required":false,"description":"How many matching rows to skip. Use with total to page.","schema":{"type":"integer","minimum":0,"maximum":9007199254740991,"default":0}}],"responses":{"200":{"description":"A page of graves. An empty list is a valid answer, not an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraveList"}}}},"400":{"description":"A parameter was not one this endpoint accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/graves/{slug}":{"get":{"operationId":"getGrave","summary":"Read one grave in full","description":"One grave with everything the archive holds: the epitaph, the launch and retirement dates, the shutdown date the provider published, the successor, the pricing and context window, and the provider pages every date is cited from. Accepts a retired snapshot id as well as the slug, so an id pinned in production still resolves; resolvedFrom names what was followed.","tags":["Graves"],"parameters":[{"name":"slug","in":"path","required":true,"description":"The grave slug, such as gpt-4, or a retired snapshot id such as gpt-4-0613.","schema":{"type":"string"},"example":"gpt-4-0613"}],"responses":{"200":{"description":"The grave.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraveResponse"}}}},"404":{"description":"No grave has that name. On this archive an absence is also an answer: the model may not be dead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/plots":{"get":{"operationId":"listPlots","summary":"List the family plots","description":"Every provider with a plot in the cemetery and how many models each has buried, largest first, plus the benchmarks plot. Buried and reserved are counted apart, because a model with a shutdown date announced is still answering.","tags":["Graves"],"responses":{"200":{"description":"Every plot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlotList"}}}}}}},"/graveyard.json":{"get":{"operationId":"getDataset","summary":"The whole dataset in one request","description":"Every model grave and every benchmark grave with all of their fields, as one static document. This is the right thing to fetch when you want all of it; there is no paginated form of the same data because at this size one file is the better interface.","tags":["Dataset"],"responses":{"200":{"description":"The whole archive.","content":{"application/json":{"schema":{"type":"object","properties":{"about":{"type":"string"},"license":{"type":"string"},"models":{"type":"array","items":{}},"benchmarks":{"type":"array","items":{}}},"required":["about","license","models","benchmarks"]}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","summary":"The llmstxt.org index","description":"What this archive is, when an agent should reach for it and when it should not, and where every machine-readable version lives. Follows the llmstxt.org format: an H1, a summary, then sections of links.","tags":["Dataset"],"responses":{"200":{"description":"The index, as markdown.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms-full.txt":{"get":{"operationId":"getLlmsFullTxt","summary":"Every epitaph in one file","description":"The whole cemetery as markdown in a single document, for when fetching one URL per grave is the wrong shape. Same content as the individual epitaph pages.","tags":["Dataset"],"responses":{"200":{"description":"Every epitaph.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/{slug}/epitaph.md":{"get":{"operationId":"getEpitaphMarkdown","summary":"One epitaph as markdown","description":"The epitaph page without the markup around it. Every page on this site has a .md sibling, and the same content is served from the canonical URL to a request that sends Accept: text/markdown.","tags":["Agents"],"parameters":[{"name":"slug","in":"path","required":true,"description":"The grave slug.","schema":{"type":"string"},"example":"gpt-4"}],"responses":{"200":{"description":"The epitaph.","content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"No grave has that name. The body is markdown naming where to look next.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/mcp":{"post":{"operationId":"callMcpEndpoint","summary":"The Model Context Protocol endpoint","description":"A JSON-RPC 2.0 endpoint speaking MCP over Streamable HTTP, with no authentication and no session to establish. Exposes search_graves, get_grave, list_plots and cemetery_overview as tools. Speaks both the current per-request-metadata revision and the older initialize handshake.","tags":["Agents"],"requestBody":{"required":true,"description":"A single JSON-RPC 2.0 request or notification.","content":{"application/json":{"schema":{"type":"object","properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number","null"]},"method":{"type":"string"},"params":{"type":"object"}},"required":["jsonrpc","method"]}}}},"responses":{"200":{"description":"A JSON-RPC result or error.","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"A notification was accepted. No body."},"400":{"description":"The envelope, the protocol version or the mirrored headers were rejected.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/.well-known/mcp":{"get":{"operationId":"getMcpServerCard","summary":"The MCP server card","description":"Transport, capabilities, protocol versions and tool names, readable without opening a connection. Also served at /.well-known/mcp.json and /.well-known/mcp-server, because the well-known path for this is not settled.","tags":["Agents"],"responses":{"200":{"description":"The card.","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"operationId":"callMcpAtWellKnown","summary":"Shake hands at the card address","description":"The same MCP endpoint as /mcp, answering at the address the card is published at, so a client that has just read the card does not have to open a second connection to say hello.","tags":["Agents"],"requestBody":{"required":true,"description":"A single JSON-RPC 2.0 request or notification.","content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"A JSON-RPC result or error.","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"A notification was accepted. No body."},"400":{"description":"The request was rejected.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/presence":{"post":{"operationId":"recordPresence","summary":"The site's own visitor heartbeat","description":"How many people are in the cemetery right now. Documented because it is a public endpoint, not because it is useful to a third party: an open tab posts a random id it generated for itself every twenty seconds, and the reply is how many ids were seen in the last forty-five. Rate limited to six requests per ten seconds per address.","tags":["Site"],"requestBody":{"required":true,"description":"The id this tab generated for itself.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"A v4 UUID the caller generated."},"leaving":{"type":"boolean","description":"True to remove the id rather than refresh it."}},"required":["id"]}}}},"responses":{"200":{"description":"How many people are present, or null when the count is unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"present":{"type":["integer","null"]},"unavailable":{"type":"boolean"}},"required":["present"]}}}},"400":{"description":"The body was not a heartbeat this endpoint accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}},"components":{"schemas":{"GraveRow":{"type":"object","properties":{"slug":{"type":"string","description":"The grave's address on the site. Stable; slugs do not change."},"name":{"type":"string","description":"The name people say out loud."},"kind":{"type":"string","enum":["model","benchmark"],"description":"What is buried here."},"provider":{"type":"string","description":"The maker. \"Benchmarks\" on a benchmark grave, which has no provider."},"modelId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The API string developers actually used. Null on a benchmark grave."},"aliases":{"type":"array","items":{"type":"string"},"description":"Retired snapshot ids folded into this grave. Each one redirects here and resolves through the API."},"born":{"type":"string","description":"The day it became generally available.","examples":["2024-06-06"]},"died":{"anyOf":[{"type":"string","description":"An ISO 8601 date, YYYY-MM-DD.","examples":["2024-06-06"]},{"type":"null"}],"description":"The day it stopped answering. Null means a reserved plot: deprecation announced, model still running."},"retirementScheduled":{"anyOf":[{"type":"string","description":"An ISO 8601 date, YYYY-MM-DD.","examples":["2024-06-06"]},{"type":"null"}],"description":"The shutdown date the provider published, when it published one. Null once died is set."},"causeOfDeath":{"type":"string","description":"superseded, retired, withdrawn or never-launched for a model; saturated, contaminated or superseded for a benchmark."},"successor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The slug of what replaced it. This archive's reading of lineage, not the provider's."},"epitaph":{"type":"string","description":"One to three hand-written sentences. This is the product."},"url":{"type":"string","format":"uri","description":"The epitaph page."},"sources":{"type":"array","items":{"type":"string","format":"uri"},"description":"Provider pages every date on this grave is cited from."}},"required":["slug","name","kind","provider","modelId","aliases","born","died","retirementScheduled","causeOfDeath","successor","epitaph","url","sources"],"additionalProperties":false,"description":"One grave, as it appears in a listing."},"GraveDetail":{"type":"object","properties":{"slug":{"type":"string","description":"The grave's address on the site. Stable; slugs do not change."},"name":{"type":"string","description":"The name people say out loud."},"kind":{"type":"string","enum":["model","benchmark"],"description":"What is buried here."},"provider":{"type":"string","description":"The maker. \"Benchmarks\" on a benchmark grave, which has no provider."},"modelId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The API string developers actually used. Null on a benchmark grave."},"aliases":{"type":"array","items":{"type":"string"},"description":"Retired snapshot ids folded into this grave. Each one redirects here and resolves through the API."},"born":{"type":"string","description":"The day it became generally available.","examples":["2024-06-06"]},"died":{"anyOf":[{"type":"string","description":"An ISO 8601 date, YYYY-MM-DD.","examples":["2024-06-06"]},{"type":"null"}],"description":"The day it stopped answering. Null means a reserved plot: deprecation announced, model still running."},"retirementScheduled":{"anyOf":[{"type":"string","description":"An ISO 8601 date, YYYY-MM-DD.","examples":["2024-06-06"]},{"type":"null"}],"description":"The shutdown date the provider published, when it published one. Null once died is set."},"causeOfDeath":{"type":"string","description":"superseded, retired, withdrawn or never-launched for a model; saturated, contaminated or superseded for a benchmark."},"successor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The slug of what replaced it. This archive's reading of lineage, not the provider's."},"epitaph":{"type":"string","description":"One to three hand-written sentences. This is the product."},"url":{"type":"string","format":"uri","description":"The epitaph page."},"sources":{"type":"array","items":{"type":"string","format":"uri"},"description":"Provider pages every date on this grave is cited from."},"walkUrl":{"type":"string","format":"uri","description":"The 3D walk, standing at this grave."},"successorName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The successor by name."},"deprecatedAnnounced":{"description":"Models only. When notice was given.","anyOf":[{"type":"string","description":"An ISO 8601 date, YYYY-MM-DD.","examples":["2024-06-06"]},{"type":"null"}]},"contextWindow":{"description":"Models only. Tokens.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"pricing":{"description":"Models only. US dollars per million tokens, at retirement.","anyOf":[{"type":"object","properties":{"inPerMTok":{"type":"number"},"outPerMTok":{"type":"number"}},"required":["inPerMTok","outPerMTok"],"additionalProperties":false},{"type":"null"}]},"benchmarks":{"description":"Models only. Scores as of the stated date.","anyOf":[{"type":"object","properties":{},"additionalProperties":{}},{"type":"null"}]},"lastWords":{"description":"Models only. A quirk it was known for.","anyOf":[{"type":"string"},{"type":"null"}]},"frontierAtLaunch":{"description":"Benchmarks only. Best score when it launched.","type":"number"},"frontierAtDeath":{"description":"Benchmarks only. Best score when it died.","type":"number"},"ceiling":{"description":"Benchmarks only. Practical maximum.","anyOf":[{"type":"number"},{"type":"null"}]},"ceilingBasis":{"description":"Benchmarks only. What that ceiling is a ceiling of.","anyOf":[{"type":"string"},{"type":"null"}]},"dateBasis":{"description":"Benchmarks only. Nobody publishes a shutdown notice for a benchmark, so its date is this archive's editorial judgment and the record says so.","type":"string"}},"required":["slug","name","kind","provider","modelId","aliases","born","died","retirementScheduled","causeOfDeath","successor","epitaph","url","sources","walkUrl","successorName"],"additionalProperties":false,"description":"One grave in full."},"GraveList":{"type":"object","properties":{"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"How many graves matched, before paging. Not the size of this page."},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The page size applied."},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The offset applied."},"graves":{"type":"array","items":{"$ref":"#/components/schemas/GraveRow"}},"license":{"type":"string","description":"The licence the data is offered under."},"documentation":{"type":"string","format":"uri","description":"Where the API is explained."}},"required":["total","limit","offset","graves","license","documentation"],"additionalProperties":false,"description":"A page of graves, with the size of the whole answer."},"GraveResponse":{"type":"object","properties":{"grave":{"$ref":"#/components/schemas/GraveDetail"},"resolvedFrom":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The retired snapshot id the caller asked for, when it differed from the grave that buries it. Null otherwise."},"license":{"type":"string","description":"The licence the data is offered under."},"documentation":{"type":"string","format":"uri","description":"Where the API is explained."}},"required":["grave","resolvedFrom","license","documentation"],"additionalProperties":false,"description":"One grave, and what the requested id resolved from."},"Plot":{"type":"object","properties":{"provider":{"type":"string","description":"The maker whose plot this is."},"slug":{"type":"string","description":"The plot's address on the site."},"graves":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Buried plus reserved."},"buried":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Models that have stopped answering."},"reserved":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Models with a shutdown announced that are still answering."},"url":{"type":"string","format":"uri","description":"The walk, standing at this plot."}},"required":["provider","slug","graves","buried","reserved","url"],"additionalProperties":false,"description":"One family plot."},"PlotList":{"type":"object","properties":{"plots":{"type":"array","items":{"$ref":"#/components/schemas/Plot"}},"license":{"type":"string","description":"The licence the data is offered under."},"documentation":{"type":"string","format":"uri","description":"Where the API is explained."}},"required":["plots","license","documentation"],"additionalProperties":false,"description":"Every family plot, largest first."},"ApiError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_request","not_found","method_not_allowed","not_acceptable","rate_limited","unavailable"],"description":"A closed set, so a caller can branch on it without matching the message."},"message":{"type":"string","description":"What went wrong, for a person reading a log."},"hint":{"type":"string","description":"What to try next."},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The HTTP status, repeated for callers that only keep the body."},"docs":{"type":"string","format":"uri","description":"Where the API is explained."}},"required":["code","message","hint","status","docs"],"additionalProperties":false}},"required":["error"],"additionalProperties":false,"description":"Every failure from this API, in one shape."}}}}