Sundial Habits
Reference

List Habits

GET
/api/v1/habits

Read your habits, including private habits, schedules, and check-in state for a calendar day. Results reflect server-synced data.

Authorization

accessKey
headerAuthorizationBearer <Sundial access key>

Query Parameters

day*string

Gregorian calendar date, YYYY-MM-DD, between 1900 and 2100.

Match^\d{4}-\d{2}-\d{2}$
timeZone*string

IANA time zone used to interpret today, such as America/Los_Angeles.

Lengthlength <= 100
limit*integer
Range1 <= value <= 100
Default50
cursor?string
Formatuuid

Response Body

Confirmed result.

application/json
  1. response
asOf*string
Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
Formatdate-time
habits*array<>
nextCursor*|
Formatuuid
onBreak*boolean
Example Request
curl -X GET 'https://api.sundialhabits.com/api/v1/habits?day=2026-10-20&timeZone=America%2FLos_Angeles&limit=50' \  -H 'Authorization: Bearer <ACCESS_KEY>'
Example Response
{  "asOf": "2019-08-24T14:15:22Z",  "habits": [    {      "id": "00000000-0000-4000-8000-000000000002",      "title": "string",      "archived": true,      "position": 0,      "schedule": [        {          "from": "string",          "rule": {            "kind": "daily"          }        }      ],      "reminder": {        "hour": 0,        "minute": 0      },      "visibility": "friends",      "revision": "1",      "due": true,      "checkIn": {        "habitID": "00000000-0000-4000-8000-000000000002",        "day": "2026-10-20",        "completed": true,        "timeZone": "America/Los_Angeles",        "revision": "1"      }    }  ],  "nextCursor": "00000000-0000-4000-8000-000000000002",  "onBreak": true}