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 categoryactivity: blocks, intervals and events, with apps, titles and URLsmemories: what Cronus has learned about your workscreen_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
| Endpoint | Scope | Returns | Parameters |
|---|---|---|---|
| GET /me | any | Your account, time zone and the key’s scopes. | |
| GET /categories | any | Every category, including archived ones. | |
| GET /stats/daily | stats | Per day: total, productive and unproductive time, app switches, time per category. | from, to (dates, up to 92 days) |
| GET /stats/day | stats | One day, with time per activity (app or website) as well. Summaries need activity. | date |
| GET /blocks | activity | Your calendar as Cronus draws it: blocks with their name, summary, category and activities. | from, to (dates, up to 31 days) |
| GET /intervals | activity | The timeline under the calendar: every span in an app or on a site, with title, URL and category. | from, to, limit, cursor |
| GET /events | activity | Every captured window switch, with the AI’s summary and reasoning. Screen text needs screen_text. | from, to, limit, cursor |
| GET /memories | memories | What Cronus has learned about your work. Evidence excerpts need screen_text. |
Dates and times
- Dates are
YYYY-MM-DDin your account’s time zone. A range includes both ends, sofrom=2026-10-18&to=2026-10-18is that whole day. Without dates you get today. /intervalsand/eventsalso take ISO timestamps or epoch milliseconds forfromandto.- 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
doneLimits 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.