Skip to content

Get an analytics report

GET
/api/v1/analytics
curl --request GET \
--url 'https://example.com/api/v1/analytics?period=example' \
--header 'Authorization: Bearer <token>'

Return activity and time metrics for a period and its comparison range. Choose day, week, month, quarter, or year with period; anchor defaults to today. Set both vs_from and vs_to to choose a custom comparison range. Otherwise, the server uses the previous range. Set tz and week_start to control local dates. Route: /api/v1/analytics. Inputs: period, anchor, vs_from, vs_to, tz, week_start. Safe reads can use bounded retries.

period
required
string

day, week, month, quarter or year.

anchor
string

Any day inside the current period, YYYY-MM-DD. Defaults to today.

vs_from
string

First day of the comparison range, YYYY-MM-DD. Give both vs_from and vs_to, or neither for the previous range of the same unit.

vs_to
string

Last day of the comparison range, YYYY-MM-DD, inclusive.

tz
string

IANA time zone for “today” and for the day of each file. Defaults to UTC.

week_start
integer format: int32

First day of the week, 0 = Sunday … 6 = Saturday. Defaults to 1. A 7-day window that starts on any day uses the anchor’s own weekday.

Time tracked, activity counts and habits for a range and its comparison

Media typeapplication/json

The Analytics report.

object
comparison
required

A range and its metrics.

object
from
required

First day, YYYY-MM-DD.

string
metrics
required

Range metrics: the dashboard’s numbers (calternal.js RangeMetrics).

object
active_days
required

Days with at least one Log entry (moments count).

integer format: int64
activity
required

Items added in the range, per type.

object
bookmarks
required

Bookmarks and web clips saved.

integer format: int64
events
required

Events on the day, from connected calendars.

integer format: int64
files
required

Files added or changed (photos and Notes excluded).

integer format: int64
log_entries
required

Log entries (moments included).

integer format: int64
notes
required

Notes saved (bookmarks excluded).

integer format: int64
photos
required

Photos and videos in Photos/.

integer format: int64
tasks
required

Tasks created.

integer format: int64
anomalies
required

Reversed ranges.

integer format: int64
calendar_days
required

Days in the range, empty days included.

integer format: int64
event_count
required

Timed Log entries.

integer format: int64
logged_by_category
required

Category minutes over the range, minutes DESC then key ASC. Can exceed the tracked total when entries overlap (“logged” vs “tracked”).

Array<object>

A category’s minutes. Fractional: an entry with several categories splits its time evenly.

object
key
required
string
minutes
required
number format: double
missed_min_active
required

Untracked waking minutes summed over active days.

integer format: int64
missed_min_all
required

Untracked waking minutes summed over every day.

integer format: int64
streak_days
required

Consecutive days with a Log entry, ending today (lookback about 60 days).

integer format: int64
total_tracked_min
required

Sum over days of each day’s union of intervals.

integer format: int64
to
required

Last day, YYYY-MM-DD, inclusive.

string
comparison_has_data
required

The comparison range has Log entries or items. When false, the UI shows “no comparison data” instead of a misleading +100%.

boolean
current
required

A range and its metrics.

object
from
required

First day, YYYY-MM-DD.

string
metrics
required

Range metrics: the dashboard’s numbers (calternal.js RangeMetrics).

object
active_days
required

Days with at least one Log entry (moments count).

integer format: int64
activity
required

Items added in the range, per type.

object
bookmarks
required

Bookmarks and web clips saved.

integer format: int64
events
required

Events on the day, from connected calendars.

integer format: int64
files
required

Files added or changed (photos and Notes excluded).

integer format: int64
log_entries
required

Log entries (moments included).

integer format: int64
notes
required

Notes saved (bookmarks excluded).

integer format: int64
photos
required

Photos and videos in Photos/.

integer format: int64
tasks
required

Tasks created.

integer format: int64
anomalies
required

Reversed ranges.

integer format: int64
calendar_days
required

Days in the range, empty days included.

integer format: int64
event_count
required

Timed Log entries.

integer format: int64
logged_by_category
required

Category minutes over the range, minutes DESC then key ASC. Can exceed the tracked total when entries overlap (“logged” vs “tracked”).

Array<object>

A category’s minutes. Fractional: an entry with several categories splits its time evenly.

object
key
required
string
minutes
required
number format: double
missed_min_active
required

Untracked waking minutes summed over active days.

integer format: int64
missed_min_all
required

Untracked waking minutes summed over every day.

integer format: int64
streak_days
required

Consecutive days with a Log entry, ending today (lookback about 60 days).

integer format: int64
total_tracked_min
required

Sum over days of each day’s union of intervals.

integer format: int64
to
required

Last day, YYYY-MM-DD, inclusive.

string
days
required

One point per day of the current range.

Array<object>

One day of the current range, for the charts.

object
active
required

The day had a Log entry.

boolean
activity
required

Items added on the day.

object
bookmarks
required

Bookmarks and web clips saved.

integer format: int64
events
required

Events on the day, from connected calendars.

integer format: int64
files
required

Files added or changed (photos and Notes excluded).

integer format: int64
log_entries
required

Log entries (moments included).

integer format: int64
notes
required

Notes saved (bookmarks excluded).

integer format: int64
photos
required

Photos and videos in Photos/.

integer format: int64
tasks
required

Tasks created.

integer format: int64
categories
required

Category split, minutes DESC then key ASC.

Array<object>

A category’s minutes. Fractional: an entry with several categories splits its time evenly.

object
key
required
string
minutes
required
number format: double
date
required

YYYY-MM-DD.

string
logged_min
required

Sum of the category minutes (the stacked bars fill to this).

number format: double
tracked_min
required

Union-tracked minutes (the calendar heat map).

integer format: int64
habits
required

Habits: streaks and the most active hours.

object
categories
required

Streaks of the top categories of the current range (at most five).

Array<object>

A category’s streaks.

object
current_days
required

Consecutive days ending today with time in this category.

integer format: int64
days
required

Days in the current range with time in this category.

integer format: int64
key
required
string
longest_days
required

The longest run of such days inside the current range.

integer format: int64
current_streak_days
required

Consecutive days with a Log entry, ending today.

integer format: int64
hour_entries
required

Log entries per start hour over the current range, moments included.

Array<integer>
hour_minutes
required

Tracked minutes per hour of the day over the current range (24 values).

Array<integer>
longest_streak_days
required

The longest run of active days inside the current range.

integer format: int64
peak_hours
required

Up to three hours (0-23) with the most tracked time, most first. When no time is tracked, the hours with the most entries.

Array<integer>
weekday_active_days
required

Active days per weekday over the current range (7 values, Monday first).

Array<integer>
hour_matrix
required

7 x 24 tracked minutes, weekday 0 = Monday, index weekday * 24 + hour.

Array<integer>
period
required

The period kind.

string
today
required

Today in tz. Days before it are final; today is live.

string
tz
required

The time zone used.

string
waking_min
required

The waking day that untracked time is measured against, in minutes.

integer format: int64
week_start
required

The first day of the week used.

integer format: int32
Examplegenerated
{
"comparison": {
"from": "example",
"metrics": {
"active_days": 1,
"activity": {
"bookmarks": 1,
"events": 1,
"files": 1,
"log_entries": 1,
"notes": 1,
"photos": 1,
"tasks": 1
},
"anomalies": 1,
"calendar_days": 1,
"event_count": 1,
"logged_by_category": [
{
"key": "example",
"minutes": 1
}
],
"missed_min_active": 1,
"missed_min_all": 1,
"streak_days": 1,
"total_tracked_min": 1
},
"to": "example"
},
"comparison_has_data": true,
"current": {
"from": "example",
"metrics": {
"active_days": 1,
"activity": {
"bookmarks": 1,
"events": 1,
"files": 1,
"log_entries": 1,
"notes": 1,
"photos": 1,
"tasks": 1
},
"anomalies": 1,
"calendar_days": 1,
"event_count": 1,
"logged_by_category": [
{
"key": "example",
"minutes": 1
}
],
"missed_min_active": 1,
"missed_min_all": 1,
"streak_days": 1,
"total_tracked_min": 1
},
"to": "example"
},
"days": [
{
"active": true,
"activity": {
"bookmarks": 1,
"events": 1,
"files": 1,
"log_entries": 1,
"notes": 1,
"photos": 1,
"tasks": 1
},
"categories": [
{
"key": "example",
"minutes": 1
}
],
"date": "example",
"logged_min": 1,
"tracked_min": 1
}
],
"habits": {
"categories": [
{
"current_days": 1,
"days": 1,
"key": "example",
"longest_days": 1
}
],
"current_streak_days": 1,
"hour_entries": [
1
],
"hour_minutes": [
1
],
"longest_streak_days": 1,
"peak_hours": [
1
],
"weekday_active_days": [
1
]
},
"hour_matrix": [
1
],
"period": "example",
"today": "example",
"tz": "example",
"waking_min": 1,
"week_start": 1
}
Media typeapplication/json

The standard API error response: { "error": { ... } }.

object
error
required

Error details.

object
code
required

Stable machine-readable code.

string
Allowed values: bad_request unauthorized forbidden not_found conflict name_conflict_case name_too_long push_endpoint_rejected too_many_requests internal service_unavailable
details
One of:

Optional field or operation details.

object
key
additional properties
string
message
required

Safe text for logs or a user-facing error message.

string
Example
{
"error": {
"code": "bad_request"
}
}
Media typeapplication/json

The standard API error response: { "error": { ... } }.

object
error
required

Error details.

object
code
required

Stable machine-readable code.

string
Allowed values: bad_request unauthorized forbidden not_found conflict name_conflict_case name_too_long push_endpoint_rejected too_many_requests internal service_unavailable
details
One of:

Optional field or operation details.

object
key
additional properties
string
message
required

Safe text for logs or a user-facing error message.

string
Example
{
"error": {
"code": "bad_request"
}
}