Skip to the board
DIDRESET
UTC

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?

EndpointPurposeFormat
GET /api/statusBoard status per provider: last reset, latest signal, next estimate, statsJSON
GET /api/timelineAnnouncement list, newest first; original post URL on every eventJSON or CSV
GET /api/timeline.csvSame events as CSV with a header rowCSV
GET /feed.xmlLatest 100 announcements for feed readers; per-provider with ?provider=RSS 2.0
GET /api/icsYour own 5-hour / weekly reset times as a calendar file; nothing storedtext/calendar
POST /mcpMCP server for agents: get_status, get_timeline, get_next_estimateJSON-RPC 2.0
GET /index.mdMarkdown mirror of the board for LLM readerstext/markdown
GET /openapi.jsonMachine-readable description of every endpoint on this pageOpenAPI 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.

Example request
curl -s https://didreset.com/api/status
Example response (excerpt, real data from 2026-09-18)
{
  "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?

GET/api/timeline

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

NameTypeRequiredDescription
providercodex | claude | grok | alloptionalFilter by provider. Default all.
limitinteger 1–500optionalNumber of events. Default 200.
formatjson | csvoptionalResponse format. Default json; csv is identical to /api/timeline.csv.
Example request
curl -s "https://didreset.com/api/timeline?provider=codex&limit=2"
Example response (excerpt, real data from 2026-09-18)
{
  "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?

GET/api/timeline.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

NameTypeRequiredDescription
providercodex | claude | grok | alloptionalFilter by provider. Default all.
limitinteger 1–500optionalNumber of rows. Default 200.
Example request
curl -s "https://didreset.com/api/timeline.csv?provider=all&limit=500" -o resets.csv
Example response (excerpt, real data from 2026-09-18)
id,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-2098685367058612394

Caching 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

NameTypeRequiredDescription
providercodex | claude | grokoptionalOne provider only. Omit for all three.
Example request
curl -s "https://didreset.com/feed.xml?provider=claude"
Example response (excerpt, real data from 2026-09-18)
<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

NameTypeRequiredDescription
providercodex | claude | grokrequiredWhich product the windows belong to (used in event titles).
resetAtISO 8601 with offsetoptionalYour 5-hour window reset time. At least one of resetAt / weeklyAt is required.
weeklyAtISO 8601 with offsetoptionalYour weekly window reset time.
tzIANA nameoptionalOnly echoed in the description (e.g. Asia/Shanghai).
localeen | zhoptionalLanguage of event titles. Default en.
Example request
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.ics
Example response (excerpt, real data from 2026-09-18)
BEGIN: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:VCALENDAR

Caching 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)

ToolArgumentsReturns
get_statusThe full status board, same shape as GET /api/status.
get_timelineprovider?: codex | claude | grok | all, limit?: 1–100Recent announcements, newest first, each with pageUrl (permanent DidReset anchor). Default all, 20.
get_next_estimateprovider: codex | claude | grokLast 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.

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.

https://didreset.com/openapi.json

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.

Sponsors