Cronus API

Read your own Cronus data over HTTP. The API is read-only and free on every plan.

Get a key

In the Cronus app, open Settings → Integrations → API and click New key. Choose what the key can read. The key is shown once, so copy it then. Revoke it there at any time.

  • stats: daily totals by category
  • activity: blocks, intervals and events, with apps, titles and URLs
  • memories: what Cronus has learned about your work
  • screen_text: the text Cronus read off your screen. Off by default. With on-device categorization, screen text never leaves your Mac, so there is none to return.

Make a request

Send the key as a bearer token. Every response is JSON.

curl https://cronus-server.fly.dev/api/v1/stats/daily?from=2026-10-12\&to=2026-10-18 \
  -H "Authorization: Bearer crn_..."

Base URL: https://cronus-server.fly.dev/api/v1

Endpoints

EndpointScopeReturnsParameters
GET /meanyYour account, time zone and the key’s scopes.
GET /categoriesanyEvery category, including archived ones.
GET /stats/dailystatsPer day: total, productive and unproductive time, app switches, time per category.from, to (dates, up to 92 days)
GET /stats/daystatsOne day, with time per activity (app or website) as well. Summaries need activity.date
GET /blocksactivityYour calendar as Cronus draws it: blocks with their name, summary, category and activities.from, to (dates, up to 31 days)
GET /intervalsactivityThe timeline under the calendar: every span in an app or on a site, with title, URL and category.from, to, limit, cursor
GET /eventsactivityEvery captured window switch, with the AI’s summary and reasoning. Screen text needs screen_text.from, to, limit, cursor
GET /memoriesmemoriesWhat Cronus has learned about your work. Evidence excerpts need screen_text.

Dates and times

  • Dates are YYYY-MM-DD in your account’s time zone. A range includes both ends, so from=2026-10-18&to=2026-10-18 is that whole day. Without dates you get today.
  • /intervals and /events also take ISO timestamps or epoch milliseconds for from and to.
  • Times in responses are ISO 8601 in UTC. Durations are milliseconds.

Paging

/intervals and /events return up to limit rows (default 200, max 1000) and a nextCursor. Pass it back as cursor with the same range until it is null.

cursor=""
while :; do
  page=$(curl -s "https://cronus-server.fly.dev/api/v1/events?from=2026-10-18&limit=500&cursor=$cursor" \
    -H "Authorization: Bearer $CRONUS_API_KEY")
  echo "$page" | jq -c '.events[]'
  cursor=$(echo "$page" | jq -r '.nextCursor // empty')
  [ -z "$cursor" ] && break
done

Limits and errors

60 requests per minute per key. Over that you get 429 with a Retry-After header. Errors look like {"error": {"code": "missing_scope", "message": "..."}}: 401 for a missing or revoked key, 403 for a missing scope, 400 for bad parameters.