Skip to content
Rigel docs
Open Rigel

How much gets done, and how long things take

tasks.stats.get

GET/api/v1/households/{household_id}/queries/tasks.stats.get

  • Query
  • Rigel runs it

Tasks done per week (starting Monday) or per month, for the last periods, oldest first; the longest and shortest open-to-done times among them; and the open tasks that have been waiting longest.

Parameters#

How much gets done, and how long things take: parameters
FieldDescription
household_idpathstringrequired

The household's ID.

granularityqueryone of: week, monthoptional

Count per week or per month.

Default "week"
periodsqueryintegeroptional

How many periods back, 1–52. Defaults to 12.

1 to 52Default 12

Response#

200 The answer.

How much gets done, and how long things take: response fields
FieldDescription
periodsarray of objectsrequired
periods[].startstring (date)required

The period's first day.

periods[].labelstringrequired

The period in words: "Nov 2" for a week, "Nov 2026" for a month.

periods[].done_countintegerrequiredNo description.
longest_donearray of objectsrequired

Up to 5 tasks done in these periods that took longest from added to done.

longest_done[].idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

longest_done[].titlestringrequiredNo description.
longest_done[].stateone of: todo, doing, blocked, donerequired

todo (to do), doing (someone's on it), blocked (can't go on until something happens) or done.

longest_done[].priorityinteger or nullrequired

The priority as a number, or null for none.

0 to 4
longest_done[].priority_wordsone of: Urgent, High, Medium, Low, Someday, null or nullrequired

The priority in words, such as "High", or null for none.

longest_done[].assigneeobject or nullrequired

Who's doing it, or null for no one yet.

longest_done[].assignee.idstringrequired

A person ID, such as per_01JC0000000000000000000000.

longest_done[].assignee.namestringrequiredNo description.
longest_done[].due_datestring (date) or nullrequired

A calendar date, YYYY-MM-DD.

longest_done[].is_overduebooleanrequired

Not done, and the due date is before today in the household's time zone.

longest_done[].scheduled_startstring (date-time) or nullrequiredNo description.
longest_done[].scheduled_endstring (date-time) or nullrequiredNo description.
longest_done[].waiting_untilstring (date-time) or nullrequired

For blocked work waiting on someone outside: when to look again.

longest_done[].is_waiting_overbooleanrequired

Blocked and waiting, and the waiting time has passed: it's back in the queue.

longest_done[].is_blockedbooleanrequired

Blocked by its state, or by a dependency that isn't done.

longest_done[].blocked_byarray of objectsrequired

The unfinished tasks this one depends on.

longest_done[].blocked_by[].idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

longest_done[].blocked_by[].titlestringrequiredNo description.
longest_done[].dependent_countintegerrequired

How many unfinished tasks are waiting on this one.

longest_done[].tagsarray of objectsrequired
longest_done[].tags[].idstringrequired

A tag ID, such as tag_01JC0000000000000000000000.

longest_done[].tags[].namestringrequiredNo description.
longest_done[].parentobject or nullrequired

The task this is a subtask of.

longest_done[].parent.idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

longest_done[].parent.titlestringrequiredNo description.
longest_done[].projectobject or nullrequired

The top-level task this belongs to, when it isn't one itself.

longest_done[].project.idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

longest_done[].project.titlestringrequiredNo description.
longest_done[].subtask_open_countintegerrequired

Unfinished subtasks, at any depth.

longest_done[].subtask_done_countintegerrequired

Finished subtasks, at any depth.

longest_done[].duplicate_ofobject or nullrequired

A task, by ID and title.

longest_done[].duplicate_of.idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

longest_done[].duplicate_of.titlestringrequiredNo description.
longest_done[].completed_atstring (date-time) or nullrequiredNo description.
longest_done[].created_atstring (date-time)requiredNo description.
longest_done[].updated_atstring (date-time)requiredNo description.
longest_done[].labelstringrequired

The task in one line, for reading aloud: "Order shelves · High · Ada · due Nov 20 · blocked by Measure".

longest_done[].open_daysnumberrequiredNo description.
shortest_donearray of objectsrequired

Up to 5 that were done fastest.

shortest_done[].idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

shortest_done[].titlestringrequiredNo description.
shortest_done[].stateone of: todo, doing, blocked, donerequired

todo (to do), doing (someone's on it), blocked (can't go on until something happens) or done.

shortest_done[].priorityinteger or nullrequired

The priority as a number, or null for none.

0 to 4
shortest_done[].priority_wordsone of: Urgent, High, Medium, Low, Someday, null or nullrequired

The priority in words, such as "High", or null for none.

shortest_done[].assigneeobject or nullrequired

Who's doing it, or null for no one yet.

shortest_done[].assignee.idstringrequired

A person ID, such as per_01JC0000000000000000000000.

shortest_done[].assignee.namestringrequiredNo description.
shortest_done[].due_datestring (date) or nullrequired

A calendar date, YYYY-MM-DD.

shortest_done[].is_overduebooleanrequired

Not done, and the due date is before today in the household's time zone.

shortest_done[].scheduled_startstring (date-time) or nullrequiredNo description.
shortest_done[].scheduled_endstring (date-time) or nullrequiredNo description.
shortest_done[].waiting_untilstring (date-time) or nullrequired

For blocked work waiting on someone outside: when to look again.

shortest_done[].is_waiting_overbooleanrequired

Blocked and waiting, and the waiting time has passed: it's back in the queue.

shortest_done[].is_blockedbooleanrequired

Blocked by its state, or by a dependency that isn't done.

shortest_done[].blocked_byarray of objectsrequired

The unfinished tasks this one depends on.

shortest_done[].blocked_by[].idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

shortest_done[].blocked_by[].titlestringrequiredNo description.
shortest_done[].dependent_countintegerrequired

How many unfinished tasks are waiting on this one.

shortest_done[].tagsarray of objectsrequired
shortest_done[].tags[].idstringrequired

A tag ID, such as tag_01JC0000000000000000000000.

shortest_done[].tags[].namestringrequiredNo description.
shortest_done[].parentobject or nullrequired

The task this is a subtask of.

shortest_done[].parent.idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

shortest_done[].parent.titlestringrequiredNo description.
shortest_done[].projectobject or nullrequired

The top-level task this belongs to, when it isn't one itself.

shortest_done[].project.idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

shortest_done[].project.titlestringrequiredNo description.
shortest_done[].subtask_open_countintegerrequired

Unfinished subtasks, at any depth.

shortest_done[].subtask_done_countintegerrequired

Finished subtasks, at any depth.

shortest_done[].duplicate_ofobject or nullrequired

A task, by ID and title.

shortest_done[].duplicate_of.idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

shortest_done[].duplicate_of.titlestringrequiredNo description.
shortest_done[].completed_atstring (date-time) or nullrequiredNo description.
shortest_done[].created_atstring (date-time)requiredNo description.
shortest_done[].updated_atstring (date-time)requiredNo description.
shortest_done[].labelstringrequired

The task in one line, for reading aloud: "Order shelves · High · Ada · due Nov 20 · blocked by Measure".

shortest_done[].open_daysnumberrequiredNo description.
longest_openarray of objectsrequired

Up to 5 open tasks that were added longest ago.

longest_open[].idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

longest_open[].titlestringrequiredNo description.
longest_open[].stateone of: todo, doing, blocked, donerequired

todo (to do), doing (someone's on it), blocked (can't go on until something happens) or done.

longest_open[].priorityinteger or nullrequired

The priority as a number, or null for none.

0 to 4
longest_open[].priority_wordsone of: Urgent, High, Medium, Low, Someday, null or nullrequired

The priority in words, such as "High", or null for none.

longest_open[].assigneeobject or nullrequired

Who's doing it, or null for no one yet.

longest_open[].assignee.idstringrequired

A person ID, such as per_01JC0000000000000000000000.

longest_open[].assignee.namestringrequiredNo description.
longest_open[].due_datestring (date) or nullrequired

A calendar date, YYYY-MM-DD.

longest_open[].is_overduebooleanrequired

Not done, and the due date is before today in the household's time zone.

longest_open[].scheduled_startstring (date-time) or nullrequiredNo description.
longest_open[].scheduled_endstring (date-time) or nullrequiredNo description.
longest_open[].waiting_untilstring (date-time) or nullrequired

For blocked work waiting on someone outside: when to look again.

longest_open[].is_waiting_overbooleanrequired

Blocked and waiting, and the waiting time has passed: it's back in the queue.

longest_open[].is_blockedbooleanrequired

Blocked by its state, or by a dependency that isn't done.

longest_open[].blocked_byarray of objectsrequired

The unfinished tasks this one depends on.

longest_open[].blocked_by[].idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

longest_open[].blocked_by[].titlestringrequiredNo description.
longest_open[].dependent_countintegerrequired

How many unfinished tasks are waiting on this one.

longest_open[].tagsarray of objectsrequired
longest_open[].tags[].idstringrequired

A tag ID, such as tag_01JC0000000000000000000000.

longest_open[].tags[].namestringrequiredNo description.
longest_open[].parentobject or nullrequired

The task this is a subtask of.

longest_open[].parent.idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

longest_open[].parent.titlestringrequiredNo description.
longest_open[].projectobject or nullrequired

The top-level task this belongs to, when it isn't one itself.

longest_open[].project.idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

longest_open[].project.titlestringrequiredNo description.
longest_open[].subtask_open_countintegerrequired

Unfinished subtasks, at any depth.

longest_open[].subtask_done_countintegerrequired

Finished subtasks, at any depth.

longest_open[].duplicate_ofobject or nullrequired

A task, by ID and title.

longest_open[].duplicate_of.idstringrequired

A task ID, such as tsk_01JC0000000000000000000000.

longest_open[].duplicate_of.titlestringrequiredNo description.
longest_open[].completed_atstring (date-time) or nullrequiredNo description.
longest_open[].created_atstring (date-time)requiredNo description.
longest_open[].updated_atstring (date-time)requiredNo description.
longest_open[].labelstringrequired

The task in one line, for reading aloud: "Order shelves · High · Ada · due Nov 20 · blocked by Measure".

longest_open[].open_daysnumberrequiredNo description.

Errors#

Every error has the same envelope: error.code, error.message, error.details, error.recovery and error.request_id.

How much gets done, and how long things take: errors
StatusCodeWhen
400validation_failedA field is missing, misspelled or out of range. details.fields lists each problem.
401unauthenticatedThe request has no valid session.
404not_foundThe household doesn't exist, or you aren't a member of it.

Examples#

These are real. Each was recorded from a sample household, the Okafors, running through the whole API when this site was built.

How much gets done each week

Request, curl
curl 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/queries/tasks.stats.get' \
  -H "Cookie: rigel_session=$RIGEL_SESSION"
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/queries/tasks.stats.get", {
  headers: {
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
});
const data = await response.json();
Request, HTTP
GET /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/queries/tasks.stats.get HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CT699EZ7R1878QCC9YDV

{
  "periods": [
    {
      "start": "2026-08-17",
      "label": "Aug 17",
      "done_count": 0
    },
    {
      "start": "2026-08-24",
      "label": "Aug 24",
      "done_count": 0
    },
    {
      "start": "2026-08-31",
      "label": "Aug 31",
      "done_count": 0
    },
    {
      "start": "2026-09-07",
      "label": "Sep 7",
      "done_count": 0
    },
    {
      "start": "2026-09-14",
      "label": "Sep 14",
      "done_count": 0
    },
    {
      "start": "2026-09-21",
      "label": "Sep 21",
      "done_count": 0
    },
    {
      "start": "2026-09-28",
      "label": "Sep 28",
      "done_count": 0
    },
    {
      "start": "2026-10-05",
      "label": "Oct 5",
      "done_count": 0
    },
    {
      "start": "2026-10-12",
      "label": "Oct 12",
      "done_count": 0
    },
    {
      "start": "2026-10-19",
      "label": "Oct 19",
      "done_count": 0
    },
    {
      "start": "2026-10-26",
      "label": "Oct 26",
      "done_count": 0
    },
    {
      "start": "2026-11-02",
      "label": "Nov 2",
      "done_count": 5
    }
  ],
  "longest_done": [
    {
      "id": "tsk_01M6V9CSWM4HX16DAY238SRYCZ",
      "title": "Replace the furnace filter",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-11-19",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.702Z",
      "created_at": "2026-11-07T15:17:52.661Z",
      "updated_at": "2026-11-07T15:17:52.702Z",
      "label": "Replace the furnace filter · Ben Okafor · due Nov 19 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2QVG1D1T82PW3837ZG",
      "title": "Put toys away",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS7CDAEP5VDA5T8R9TG6",
        "name": "Theo"
      },
      "due_date": "2026-11-08",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [
        {
          "id": "tag_01M6V9CT2QMBNSDQ82KK1PJ6AV",
          "name": "chores"
        },
        {
          "id": "tag_01M6V9CT2M8VA69RH7FX0XX026",
          "name": "kids"
        }
      ],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.890Z",
      "created_at": "2026-11-07T15:17:52.855Z",
      "updated_at": "2026-11-07T15:17:52.890Z",
      "label": "Put toys away · Theo · due Nov 8 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSX169EH1HHS6VCEMSXP",
      "title": "Test the smoke alarms",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
        "name": "Ada Okafor"
      },
      "due_date": "2026-11-12",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.698Z",
      "created_at": "2026-11-07T15:17:52.673Z",
      "updated_at": "2026-11-07T15:17:52.698Z",
      "label": "Test the smoke alarms · Ada Okafor · due Nov 12 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2ZX70MX87DDSFGCJFZ",
      "title": "Measure the walls",
      "state": "done",
      "priority": 1,
      "priority_words": "High",
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-11-11",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 1,
      "tags": [],
      "parent": {
        "id": "tsk_01M6V9CT2Z01QVT17DRMSXTW4W",
        "title": "Redo the playroom"
      },
      "project": {
        "id": "tsk_01M6V9CT2Z01QVT17DRMSXTW4W",
        "title": "Redo the playroom"
      },
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.888Z",
      "created_at": "2026-11-07T15:17:52.863Z",
      "updated_at": "2026-11-07T15:17:52.888Z",
      "label": "Measure the walls · High · Ben Okafor · due Nov 11 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSXBTAQ3ART595JCSKEV",
      "title": "Drain the outdoor faucets",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": null,
      "due_date": "2026-11-15",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.705Z",
      "created_at": "2026-11-07T15:17:52.684Z",
      "updated_at": "2026-11-07T15:17:52.705Z",
      "label": "Drain the outdoor faucets · due Nov 15 · done",
      "open_days": 0
    }
  ],
  "shortest_done": [
    {
      "id": "tsk_01M6V9CSXBTAQ3ART595JCSKEV",
      "title": "Drain the outdoor faucets",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": null,
      "due_date": "2026-11-15",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.705Z",
      "created_at": "2026-11-07T15:17:52.684Z",
      "updated_at": "2026-11-07T15:17:52.705Z",
      "label": "Drain the outdoor faucets · due Nov 15 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSX169EH1HHS6VCEMSXP",
      "title": "Test the smoke alarms",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
        "name": "Ada Okafor"
      },
      "due_date": "2026-11-12",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.698Z",
      "created_at": "2026-11-07T15:17:52.673Z",
      "updated_at": "2026-11-07T15:17:52.698Z",
      "label": "Test the smoke alarms · Ada Okafor · due Nov 12 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2ZX70MX87DDSFGCJFZ",
      "title": "Measure the walls",
      "state": "done",
      "priority": 1,
      "priority_words": "High",
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-11-11",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 1,
      "tags": [],
      "parent": {
        "id": "tsk_01M6V9CT2Z01QVT17DRMSXTW4W",
        "title": "Redo the playroom"
      },
      "project": {
        "id": "tsk_01M6V9CT2Z01QVT17DRMSXTW4W",
        "title": "Redo the playroom"
      },
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.888Z",
      "created_at": "2026-11-07T15:17:52.863Z",
      "updated_at": "2026-11-07T15:17:52.888Z",
      "label": "Measure the walls · High · Ben Okafor · due Nov 11 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2QVG1D1T82PW3837ZG",
      "title": "Put toys away",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS7CDAEP5VDA5T8R9TG6",
        "name": "Theo"
      },
      "due_date": "2026-11-08",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [
        {
          "id": "tag_01M6V9CT2QMBNSDQ82KK1PJ6AV",
          "name": "chores"
        },
        {
          "id": "tag_01M6V9CT2M8VA69RH7FX0XX026",
          "name": "kids"
        }
      ],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.890Z",
      "created_at": "2026-11-07T15:17:52.855Z",
      "updated_at": "2026-11-07T15:17:52.890Z",
      "label": "Put toys away · Theo · due Nov 8 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSWM4HX16DAY238SRYCZ",
      "title": "Replace the furnace filter",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-11-19",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.702Z",
      "created_at": "2026-11-07T15:17:52.661Z",
      "updated_at": "2026-11-07T15:17:52.702Z",
      "label": "Replace the furnace filter · Ben Okafor · due Nov 19 · done",
      "open_days": 0
    }
  ],
  "longest_open": [
    {
      "id": "tsk_01M6V9CSWXE3SPZ7C7D16XPXAC",
      "title": "Clean the gutters",
      "state": "todo",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-12-05",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": null,
      "created_at": "2026-11-07T15:17:52.669Z",
      "updated_at": "2026-11-07T15:17:52.669Z",
      "label": "Clean the gutters · Ben Okafor · due Dec 5",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSX53QVG50HVGWFG9B2E",
      "title": "Clean the dryer vent",
      "state": "todo",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
        "name": "Ada Okafor"
      },
      "due_date": "2026-10-23",
      "is_overdue": true,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": null,
      "created_at": "2026-11-07T15:17:52.678Z",
      "updated_at": "2026-11-07T15:17:52.678Z",
      "label": "Clean the dryer vent · Ada Okafor · overdue · Oct 23",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSXFWJR6465GFBHRGTXC",
      "title": "Annual furnace inspection",
      "state": "todo",
      "priority": null,
      "priority_words": null,
      "assignee": null,
      "due_date": "2026-11-19",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": null,
      "created_at": "2026-11-07T15:17:52.688Z",
      "updated_at": "2026-11-07T15:17:52.688Z",
      "label": "Annual furnace inspection · due Nov 19",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2FB0DD6W26P2MTCZPP",
      "title": "Book Theo's flu shot",
      "state": "todo",
      "priority": 1,
      "priority_words": "High",
      "assignee": {
        "id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
        "name": "Ada Okafor"
      },
      "due_date": "2026-11-10",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [
        {
          "id": "tag_01M6V9CT2M8VA69RH7FX0XX026",
          "name": "kids"
        },
        {
          "id": "tag_01M6V9CT3EYS7FXZH49FJMS5PK",
          "name": "phone call"
        }
      ],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": null,
      "created_at": "2026-11-07T15:17:52.847Z",
      "updated_at": "2026-11-07T15:17:52.877Z",
      "label": "Book Theo's flu shot · High · Ada Okafor · due Tue",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2HD6NKJXPTTWJTBTYS",
      "title": "Renew the car registration",
      "state": "todo",
      "priority": 1,
      "priority_words": "High",
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-11-19",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [
        {
          "id": "tag_01M6V9CT2HYP2JXTPT7T98VN41",
          "name": "errands"
        }
      ],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": null,
      "created_at": "2026-11-07T15:17:52.849Z",
      "updated_at": "2026-11-07T15:17:52.849Z",
      "label": "Renew the car registration · High · Ben Okafor · due Nov 19",
      "open_days": 0
    }
  ]
}

How much gets done each month

periods is how many months back.

Request, curl
curl 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/queries/tasks.stats.get?granularity=month&periods=6' \
  -H "Cookie: rigel_session=$RIGEL_SESSION"
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/queries/tasks.stats.get?granularity=month&periods=6", {
  headers: {
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
});
const data = await response.json();
Request, HTTP
GET /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/queries/tasks.stats.get?granularity=month&periods=6 HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CT6E2BKNDSB8X7KH3JTC

{
  "periods": [
    {
      "start": "2026-06-01",
      "label": "Jun 2026",
      "done_count": 0
    },
    {
      "start": "2026-07-01",
      "label": "Jul 2026",
      "done_count": 0
    },
    {
      "start": "2026-08-01",
      "label": "Aug 2026",
      "done_count": 0
    },
    {
      "start": "2026-09-01",
      "label": "Sep 2026",
      "done_count": 0
    },
    {
      "start": "2026-10-01",
      "label": "Oct 2026",
      "done_count": 0
    },
    {
      "start": "2026-11-01",
      "label": "Nov 2026",
      "done_count": 5
    }
  ],
  "longest_done": [
    {
      "id": "tsk_01M6V9CSWM4HX16DAY238SRYCZ",
      "title": "Replace the furnace filter",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-11-19",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.702Z",
      "created_at": "2026-11-07T15:17:52.661Z",
      "updated_at": "2026-11-07T15:17:52.702Z",
      "label": "Replace the furnace filter · Ben Okafor · due Nov 19 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2QVG1D1T82PW3837ZG",
      "title": "Put toys away",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS7CDAEP5VDA5T8R9TG6",
        "name": "Theo"
      },
      "due_date": "2026-11-08",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [
        {
          "id": "tag_01M6V9CT2QMBNSDQ82KK1PJ6AV",
          "name": "chores"
        },
        {
          "id": "tag_01M6V9CT2M8VA69RH7FX0XX026",
          "name": "kids"
        }
      ],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.890Z",
      "created_at": "2026-11-07T15:17:52.855Z",
      "updated_at": "2026-11-07T15:17:52.890Z",
      "label": "Put toys away · Theo · due Nov 8 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSX169EH1HHS6VCEMSXP",
      "title": "Test the smoke alarms",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
        "name": "Ada Okafor"
      },
      "due_date": "2026-11-12",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.698Z",
      "created_at": "2026-11-07T15:17:52.673Z",
      "updated_at": "2026-11-07T15:17:52.698Z",
      "label": "Test the smoke alarms · Ada Okafor · due Nov 12 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2ZX70MX87DDSFGCJFZ",
      "title": "Measure the walls",
      "state": "done",
      "priority": 1,
      "priority_words": "High",
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-11-11",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 1,
      "tags": [],
      "parent": {
        "id": "tsk_01M6V9CT2Z01QVT17DRMSXTW4W",
        "title": "Redo the playroom"
      },
      "project": {
        "id": "tsk_01M6V9CT2Z01QVT17DRMSXTW4W",
        "title": "Redo the playroom"
      },
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.888Z",
      "created_at": "2026-11-07T15:17:52.863Z",
      "updated_at": "2026-11-07T15:17:52.888Z",
      "label": "Measure the walls · High · Ben Okafor · due Nov 11 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSXBTAQ3ART595JCSKEV",
      "title": "Drain the outdoor faucets",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": null,
      "due_date": "2026-11-15",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.705Z",
      "created_at": "2026-11-07T15:17:52.684Z",
      "updated_at": "2026-11-07T15:17:52.705Z",
      "label": "Drain the outdoor faucets · due Nov 15 · done",
      "open_days": 0
    }
  ],
  "shortest_done": [
    {
      "id": "tsk_01M6V9CSXBTAQ3ART595JCSKEV",
      "title": "Drain the outdoor faucets",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": null,
      "due_date": "2026-11-15",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.705Z",
      "created_at": "2026-11-07T15:17:52.684Z",
      "updated_at": "2026-11-07T15:17:52.705Z",
      "label": "Drain the outdoor faucets · due Nov 15 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSX169EH1HHS6VCEMSXP",
      "title": "Test the smoke alarms",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
        "name": "Ada Okafor"
      },
      "due_date": "2026-11-12",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.698Z",
      "created_at": "2026-11-07T15:17:52.673Z",
      "updated_at": "2026-11-07T15:17:52.698Z",
      "label": "Test the smoke alarms · Ada Okafor · due Nov 12 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2ZX70MX87DDSFGCJFZ",
      "title": "Measure the walls",
      "state": "done",
      "priority": 1,
      "priority_words": "High",
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-11-11",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 1,
      "tags": [],
      "parent": {
        "id": "tsk_01M6V9CT2Z01QVT17DRMSXTW4W",
        "title": "Redo the playroom"
      },
      "project": {
        "id": "tsk_01M6V9CT2Z01QVT17DRMSXTW4W",
        "title": "Redo the playroom"
      },
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.888Z",
      "created_at": "2026-11-07T15:17:52.863Z",
      "updated_at": "2026-11-07T15:17:52.888Z",
      "label": "Measure the walls · High · Ben Okafor · due Nov 11 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2QVG1D1T82PW3837ZG",
      "title": "Put toys away",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS7CDAEP5VDA5T8R9TG6",
        "name": "Theo"
      },
      "due_date": "2026-11-08",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [
        {
          "id": "tag_01M6V9CT2QMBNSDQ82KK1PJ6AV",
          "name": "chores"
        },
        {
          "id": "tag_01M6V9CT2M8VA69RH7FX0XX026",
          "name": "kids"
        }
      ],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.890Z",
      "created_at": "2026-11-07T15:17:52.855Z",
      "updated_at": "2026-11-07T15:17:52.890Z",
      "label": "Put toys away · Theo · due Nov 8 · done",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSWM4HX16DAY238SRYCZ",
      "title": "Replace the furnace filter",
      "state": "done",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-11-19",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": "2026-11-07T15:17:52.702Z",
      "created_at": "2026-11-07T15:17:52.661Z",
      "updated_at": "2026-11-07T15:17:52.702Z",
      "label": "Replace the furnace filter · Ben Okafor · due Nov 19 · done",
      "open_days": 0
    }
  ],
  "longest_open": [
    {
      "id": "tsk_01M6V9CSWXE3SPZ7C7D16XPXAC",
      "title": "Clean the gutters",
      "state": "todo",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-12-05",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": null,
      "created_at": "2026-11-07T15:17:52.669Z",
      "updated_at": "2026-11-07T15:17:52.669Z",
      "label": "Clean the gutters · Ben Okafor · due Dec 5",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSX53QVG50HVGWFG9B2E",
      "title": "Clean the dryer vent",
      "state": "todo",
      "priority": null,
      "priority_words": null,
      "assignee": {
        "id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
        "name": "Ada Okafor"
      },
      "due_date": "2026-10-23",
      "is_overdue": true,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": null,
      "created_at": "2026-11-07T15:17:52.678Z",
      "updated_at": "2026-11-07T15:17:52.678Z",
      "label": "Clean the dryer vent · Ada Okafor · overdue · Oct 23",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CSXFWJR6465GFBHRGTXC",
      "title": "Annual furnace inspection",
      "state": "todo",
      "priority": null,
      "priority_words": null,
      "assignee": null,
      "due_date": "2026-11-19",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": null,
      "created_at": "2026-11-07T15:17:52.688Z",
      "updated_at": "2026-11-07T15:17:52.688Z",
      "label": "Annual furnace inspection · due Nov 19",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2FB0DD6W26P2MTCZPP",
      "title": "Book Theo's flu shot",
      "state": "todo",
      "priority": 1,
      "priority_words": "High",
      "assignee": {
        "id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
        "name": "Ada Okafor"
      },
      "due_date": "2026-11-10",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [
        {
          "id": "tag_01M6V9CT2M8VA69RH7FX0XX026",
          "name": "kids"
        },
        {
          "id": "tag_01M6V9CT3EYS7FXZH49FJMS5PK",
          "name": "phone call"
        }
      ],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": null,
      "created_at": "2026-11-07T15:17:52.847Z",
      "updated_at": "2026-11-07T15:17:52.877Z",
      "label": "Book Theo's flu shot · High · Ada Okafor · due Tue",
      "open_days": 0
    },
    {
      "id": "tsk_01M6V9CT2HD6NKJXPTTWJTBTYS",
      "title": "Renew the car registration",
      "state": "todo",
      "priority": 1,
      "priority_words": "High",
      "assignee": {
        "id": "per_01M6V9CS744BQQH188FS6CXY9W",
        "name": "Ben Okafor"
      },
      "due_date": "2026-11-19",
      "is_overdue": false,
      "scheduled_start": null,
      "scheduled_end": null,
      "waiting_until": null,
      "is_waiting_over": false,
      "is_blocked": false,
      "blocked_by": [],
      "dependent_count": 0,
      "tags": [
        {
          "id": "tag_01M6V9CT2HYP2JXTPT7T98VN41",
          "name": "errands"
        }
      ],
      "parent": null,
      "project": null,
      "subtask_open_count": 0,
      "subtask_done_count": 0,
      "duplicate_of": null,
      "completed_at": null,
      "created_at": "2026-11-07T15:17:52.849Z",
      "updated_at": "2026-11-07T15:17:52.849Z",
      "label": "Renew the car registration · High · Ben Okafor · due Nov 19",
      "open_days": 0
    }
  ]
}

For Rigel#

Rigel's tool for this query is tasks_stats_get. Rigel runs this on its own, then says what it did. The agent guide has the rest.

Rigel is in early access, and sign-up is by invitation. Open Rigel