Public API
by vortwangUpdated
DidReset publishes its reset data through free, unauthenticated endpoints: JSON status (/api/status), a JSON or CSV timeline (/api/timeline, /api/timeline.csv), an RSS feed (/feed.xml), an .ics calendar builder (/api/ics), plus an MCP server at /mcp and a Markdown mirror at /index.md. Every response carries Access-Control-Allow-Origin: *, board data is cached at the edge for 60 seconds, and every event keeps the URL of the original post. If you use this data, link to didreset.com.
Can I use this data?
- Yes. All endpoints are free, need no API key or sign-up, and answer with Access-Control-Allow-Origin: * so a browser page can call them directly.
- If you use this data, link to didreset.com. A visible link on the page, a line in your README or an attribution field in your dataset is enough.
- Keep sourceUrl when you republish an event. Every row on this site points to the original public post so readers can verify it themselves.
- nextEstimate is a cadence estimate (last reset plus the median gap of the last 10 resets), not a vendor schedule. Say so when you show it.
- Not affiliated with OpenAI, Anthropic or xAI. Data is offered as-is, without warranty; do not build anything that breaks when a field is null.
If you use this data, link to didreset.com
Which endpoint do I need?
| Endpoint | Purpose | Format |
|---|---|---|
| GET /api/status | Board status per provider: last reset, latest signal, next estimate, stats | JSON |
| GET /api/timeline | Announcement list, newest first; original post URL on every event | JSON or CSV |
| GET /api/timeline.csv | Same events as CSV with a header row | CSV |
| GET /feed.xml | Latest 100 announcements for feed readers; per-provider with ?provider= | RSS 2.0 |
| GET /api/ics | Your own 5-hour / weekly reset times as a calendar file; nothing stored | text/calendar |
| POST /mcp | MCP server for agents: get_status, get_timeline, get_next_estimate | JSON-RPC 2.0 |
| GET /index.md | Markdown mirror of the board for LLM readers | text/markdown |
| GET /openapi.json | Machine-readable description of every endpoint on this page | OpenAPI 3.1 |
What does GET /api/status return?
GET/api/status
One object per provider (codex, claude, grok): the board status word, the last official account-wide reset, the latest signal of any kind, the cadence estimate for the next reset, and stats (total resets, median and mean gap in days, longest wait, 24-bucket hour histogram in UTC).
Parameters
No parameters.
curl -s https://didreset.com/api/status{
"updatedAt": "2026-09-18T03:42:59.306Z",
"providers": [
{
"provider": "codex",
"daysSince": 5.82,
"status": "overdue",
"lastReset": {
"id": "2098685367058612394",
"kind": "reset",
"scope": "global",
"announcedAt": "2026-09-12T08:09:17.000Z",
"sourceUrl": "https://x.com/thsottiaux/status/2098685367058612394",
"sourceAccount": "@thsottiaux",
"summary": "Reset all propagated. Sweet dreams. https://t.co/VgKVUixoJG",
"verified": true
},
"nextEstimate": "2026-09-14T12:14:05.000Z",
"stats": { "totalResets": 44, "medianIntervalDays": 2.17, "meanIntervalDays": 8.37, "longestWaitDays": 73.16 }
}
]
}Caching and rate limits
Cache-Control: public, s-maxage=60, stale-while-revalidate=300. The edge serves the same body for 60 seconds, so polling more often than once a minute returns nothing new. No hard rate limit; please stay at or below one request per minute per client.
Field notes
- status is one of reset_now | banked | tease | waiting | overdue | no_data (the same words as the STATUS column on the board).
- nextEstimate = last reset + median gap of the last 10 resets; null when there is not enough history. A value in the past means "any time now", not a missed schedule.
- lastReset and latestSignal are full event objects (same shape as /api/timeline) or null.
What does GET /api/timeline return?
The announcement list, newest first. Each event has an id (the post id), provider, kind, scope, announcedAt, the original post URL and account, an excerpt, and a verified flag. Add format=csv for the same rows as CSV.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| provider | codex | claude | grok | all | optional | Filter by provider. Default all. |
| limit | integer 1–500 | optional | Number of events. Default 200. |
| format | json | csv | optional | Response format. Default json; csv is identical to /api/timeline.csv. |
curl -s "https://didreset.com/api/timeline?provider=codex&limit=2"{
"provider": "codex",
"updatedAt": "2026-09-18T03:43:00.208Z",
"events": [
{
"id": "2098685367058612394",
"provider": "codex",
"kind": "reset",
"scope": "global",
"announcedAt": "2026-09-12T08:09:17.000Z",
"effectiveAt": null,
"sourceUrl": "https://x.com/thsottiaux/status/2098685367058612394",
"sourceAccount": "@thsottiaux",
"summary": "Reset all propagated. Sweet dreams. https://t.co/VgKVUixoJG",
"audience": [],
"verified": true
}
]
}Caching and rate limits
Cache-Control: public, s-maxage=60, stale-while-revalidate=300; same guidance as /api/status. Invalid query values return 400 with a zod issues array.
Field notes
- kind is one of reset | banked | boost | promo | tease. Only reset events count toward the cadence stats.
- scope is global (everyone) or plan:{name} (one plan). effectiveAt is set only when a post names a later effective time.
- The permanent page for an event is https://didreset.com/{provider}#event-{id}.
How do I get the timeline as CSV?
The same events as /api/timeline, as RFC 4180 CSV with a header row, for spreadsheets and data pipelines. Columns: id, date (ISO 8601 UTC), provider, kind, scope, summary, source_url, page_url.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| provider | codex | claude | grok | all | optional | Filter by provider. Default all. |
| limit | integer 1–500 | optional | Number of rows. Default 200. |
curl -s "https://didreset.com/api/timeline.csv?provider=all&limit=500" -o resets.csvid,date,provider,kind,scope,summary,source_url,page_url
2098685367058612394,2026-09-12T08:09:17.000Z,codex,reset,global,Reset all propagated. Sweet dreams. https://t.co/VgKVUixoJG,https://x.com/thsottiaux/status/2098685367058612394,https://didreset.com/codex#event-2098685367058612394Caching and rate limits
Cache-Control: public, s-maxage=60, stale-while-revalidate=300. Content-Type text/csv; charset=utf-8; served inline so a browser shows it, and easy to save with -o.
Field notes
- Fields containing commas, quotes or line breaks are double-quoted; quotes inside are doubled. Rows end with CRLF.
Is there an RSS feed?
GET/feed.xml
RSS 2.0 with the latest 100 announcements across providers, newest first. Each item links to the permanent DidReset anchor for the event; the original post is in the <source> element and inside the description.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| provider | codex | claude | grok | optional | One provider only. Omit for all three. |
curl -s "https://didreset.com/feed.xml?provider=claude"<item>
<title>Codex · Reset · 12 Sep 2026</title>
<link>https://didreset.com/codex#event-2098685367058612394</link>
<guid isPermaLink="true">https://didreset.com/codex#event-2098685367058612394</guid>
<pubDate>Sat, 12 Sep 2026 08:09:17 GMT</pubDate>
<category>codex</category>
<category>reset</category>
<source url="https://x.com/thsottiaux/status/2098685367058612394">@thsottiaux</source>
<description>…excerpt and a link to the original post…</description>
</item>Caching and rate limits
Cache-Control: public, s-maxage=300, stale-while-revalidate=600. Feed readers polling every 5–15 minutes see every event. /api/feed is a 308 alias to this URL.
Field notes
- Provider pages also advertise their own feed via <link rel="alternate" type="application/rss+xml">.
How do I put my own reset times on a calendar?
GET/api/ics
Builds a text/calendar (.ics) file with one 15-minute event per window you pass in (your 5-hour reset, your weekly reset, or both), each with a 5-minute reminder. Nothing is stored; the file is the only copy. The window tracker at /tools/window uses this endpoint.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| provider | codex | claude | grok | required | Which product the windows belong to (used in event titles). |
| resetAt | ISO 8601 with offset | optional | Your 5-hour window reset time. At least one of resetAt / weeklyAt is required. |
| weeklyAt | ISO 8601 with offset | optional | Your weekly window reset time. |
| tz | IANA name | optional | Only echoed in the description (e.g. Asia/Shanghai). |
| locale | en | zh | optional | Language of event titles. Default en. |
curl -s "https://didreset.com/api/ics?provider=codex&resetAt=2026-09-18T15:00:00Z&weeklyAt=2026-09-22T09:00:00Z&tz=Asia/Shanghai" -o codex.icsBEGIN:VCALENDAR
VERSION:2.0
PRODID:-//DidReset//Window Tracker//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:DidReset · Codex windows
BEGIN:VEVENT
UID:didreset-codex-5h-1789743600000@didreset.com
DTSTART:20260918T150000Z
DURATION:PT15M
SUMMARY:Codex 5-hour window resets
URL:https://didreset.com/tools/window
BEGIN:VALARM
ACTION:DISPLAY
TRIGGER:-PT5M
END:VALARM
END:VEVENT
…
END:VCALENDARCaching and rate limits
Cache-Control: no-store (the query holds your personal times). Content-Disposition: attachment. Invalid or missing times return 400.
Field notes
- Times are written in UTC (Z suffix); calendar apps convert to the local zone.
How do I connect an MCP client?
The same data is available to agents over the Model Context Protocol. The server speaks Streamable HTTP (JSON-RPC 2.0 over POST), needs no authentication and allows any origin.
MCPPOST https://didreset.com/mcp (alias: POST https://didreset.com/api/mcp)
| Tool | Arguments | Returns |
|---|---|---|
| get_status | — | The full status board, same shape as GET /api/status. |
| get_timeline | provider?: codex | claude | grok | all, limit?: 1–100 | Recent announcements, newest first, each with pageUrl (permanent DidReset anchor). Default all, 20. |
| get_next_estimate | provider: codex | claude | grok | Last reset, days since, nextEstimate, median gap and sample size for one provider, with a note that it is an estimate. |
Client configuration
Streamable HTTP clients (Claude Code, Cursor, Claude Desktop connectors) take the URL directly; stdio-only clients can bridge with mcp-remote.
{
"mcpServers": {
"didreset": { "url": "https://didreset.com/mcp" }
}
}Raw JSON-RPC, if you want to see the wire format:
curl -s https://didreset.com/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Caching and rate limits
Rate limit: 60 requests per minute per IP; beyond that the server answers 429 with a Retry-After header. MCP clients that send Accept: application/json, text/event-stream get standard SSE framing; a plain client without that header gets the same JSON-RPC message as a plain JSON body. Tool results carry both a text block (JSON) and structuredContent.
Is there a Markdown mirror for LLMs?
Yes. /index.md (English) and /zh/index.md (Chinese) render the departures board as plain Markdown (Content-Type text/markdown): the status line per provider, last reset and next estimate, the six latest announcements with their original post URLs, and the list of machine-readable endpoints. Regenerated on every request, cached at the edge for 60 seconds.
- /index.mdBoard as Markdown (English)
- /zh/index.mdBoard as Markdown (Chinese)
- /llms.txtllms.txt: site map for LLM readers
- /llms-full.txtllms-full.txt: every reference page in one file
Where is the OpenAPI spec?
Every endpoint on this page is described in an OpenAPI 3.1 document, including parameters, response schemas and the same link-back request. Load it into Swagger UI, Postman, or an SDK generator.
FAQ
Do I need an API key?
No. Every endpoint on this page is public and unauthenticated. There is no sign-up and no usage tier; the only request is that you link back to didreset.com when you use the data.
How fresh is the data?
Official accounts are polled every few minutes and each post is checked by hand before it flips the board. API responses are cached at the edge for 60 seconds (the RSS feed for 300 seconds), so a new reset shows up in the API within a minute of being confirmed.
Is nextEstimate a schedule?
No. It is the last official reset plus the median gap of the last 10 resets. Vendors do not pre-announce resets; the field can be null when there is not enough history, and a value in the past means "any time now".
Can I republish or redistribute the data?
Yes, with a link back to didreset.com and the sourceUrl of each event kept intact so readers can verify the original post. Please do not present estimates as vendor commitments.
Want the next reset on your phone?
Board · Not affiliated with OpenAI, Anthropic or xAI.