Skip to content
Rigel docs
Open Rigel

Save a view of the tasks

tasks.view.save

POST/api/v1/households/{household_id}/commands/tasks.view.save

  • Command
  • Rigel runs it
  • Applies offline

Saves a name, a mode and filters as a view that shows as a tab, or replaces an existing view's. Fails with view_not_found, person_not_found, tag_not_found or task_not_found when a filter names something that isn't there.

Parameters#

Save a view of the tasks: parameters
FieldDescription
household_idpathstringrequired

The household's ID.

Idempotency-Keyheaderstringoptional

The command's ID. Reuse it when retrying the same command.

Request body#

JSON, as application/json.

Save a view of the tasks: request body fields
FieldDescription
view_idstringoptional

The view to change; leave out to save a new one.

namestringrequired

The view's name, as written, 1–80 characters: "Errands this week".

at most 80 characters
modeone of: queue, browserequired

queue: ready work by priority, leaving out done and (unless show_blocked) blocked tasks. browse: everything, done included.

filtersobjectrequired
filters.textstringoptional

Words that must all appear in the title or description, ignoring case.

at most 200 characters
filters.statesarray, each one of: todo, doing, blocked, doneoptional

Only tasks in one of these states.

at most 50 items
filters.assignee_person_idstringoptional

Only tasks assigned to this person.

filters.prioritiesarray of numbers or nulloptional

Only tasks with one of these priorities.

at most 50 items
filters.include_tag_idsarray of stringsoptional

Only tasks with at least one of these tags.

at most 50 items
filters.exclude_tag_idsarray of stringsoptional

Leave out tasks with any of these tags.

at most 50 items
filters.due_fromstring (date)optional

Only tasks due on or after this date.

filters.due_tostring (date)optional

Only tasks due on or before this date.

filters.root_task_idstringoptional

Only this task's subtasks, at any depth (a project's work).

filters.show_blockedboolean or stringoptional

In a queue view, include blocked work too. Defaults to false.

Response#

200 The command was applied.

Save a view of the tasks: response fields
FieldDescription
resultobjectrequired

What the command returned, such as the IDs it created.

result.view_idstringrequired

The view.

versionintegerrequired

The household version after the command.

Errors#

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

Save a view of the tasks: errors
StatusCodeWhen
400validation_failedA field is missing, misspelled or out of range. details.fields lists each problem.
401unauthenticatedThe request has no valid session.
404view_not_foundA view that isn't there.
404person_not_foundAn assignee that isn't there.
404tag_not_found
  • An included tag that isn't there.
  • An excluded tag that isn't there.
404task_not_foundA root task that isn't there.
404not_foundThe household doesn't exist, or you aren't a member of it.
409idempotency_key_reusedThe Idempotency-Key was already used for a different command.

Examples#

These are real. Each scenario is one of the command's test cases, run on a household when this site was built, and the response is what the API returned.

A view with no filters

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "name": "Everything",
  "mode": "browse",
  "filters": {}
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    name: "Everything",
    mode: "browse",
    filters: {},
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "name": "Everything",
  "mode": "browse",
  "filters": {}
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R03B7V5D29P2FWN123

{
  "result": {
    "view_id": "tvw_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

Every filter: scalars in columns, states and priorities as values, tags as included or excluded

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "name": "Ada'\''s errands",
  "mode": "queue",
  "filters": {
    "text": "shelf",
    "states": [
      "todo",
      "doing"
    ],
    "assignee_person_id": "per_01JC000000000000000000000A",
    "priorities": [
      0,
      1
    ],
    "include_tag_ids": [
      "tag_01JC0000000000000000000001"
    ],
    "exclude_tag_ids": [
      "tag_01JC0000000000000000000002"
    ],
    "due_from": "2026-11-01",
    "due_to": "2026-11-30",
    "root_task_id": "tsk_01JC0000000000000000000001",
    "show_blocked": true
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    name: "Ada's errands",
    mode: "queue",
    filters: {
      text: "shelf",
      states: [
        "todo",
        "doing",
      ],
      assignee_person_id: "per_01JC000000000000000000000A",
      priorities: [
        0,
        1,
      ],
      include_tag_ids: [
        "tag_01JC0000000000000000000001",
      ],
      exclude_tag_ids: [
        "tag_01JC0000000000000000000002",
      ],
      due_from: "2026-11-01",
      due_to: "2026-11-30",
      root_task_id: "tsk_01JC0000000000000000000001",
      show_blocked: true,
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "name": "Ada's errands",
  "mode": "queue",
  "filters": {
    "text": "shelf",
    "states": [
      "todo",
      "doing"
    ],
    "assignee_person_id": "per_01JC000000000000000000000A",
    "priorities": [
      0,
      1
    ],
    "include_tag_ids": [
      "tag_01JC0000000000000000000001"
    ],
    "exclude_tag_ids": [
      "tag_01JC0000000000000000000002"
    ],
    "due_from": "2026-11-01",
    "due_to": "2026-11-30",
    "root_task_id": "tsk_01JC0000000000000000000001",
    "show_blocked": true
  }
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0HE7CSWR3PHJ87JYS

{
  "result": {
    "view_id": "tvw_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

Show_blocked false is stored as 0, not null

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "name": "Ready",
  "mode": "queue",
  "filters": {
    "show_blocked": false
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    name: "Ready",
    mode: "queue",
    filters: {
      show_blocked: false,
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "name": "Ready",
  "mode": "queue",
  "filters": {
    "show_blocked": false
  }
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R01R0VAAE1RA7RCVJH

{
  "result": {
    "view_id": "tvw_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

A tag in both lists counts as excluded; repeats are one row

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "name": "No errands",
  "mode": "browse",
  "filters": {
    "states": [
      "todo",
      "todo"
    ],
    "include_tag_ids": [
      "tag_01JC0000000000000000000001",
      "tag_01JC0000000000000000000001"
    ],
    "exclude_tag_ids": [
      "tag_01JC0000000000000000000001"
    ]
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    name: "No errands",
    mode: "browse",
    filters: {
      states: [
        "todo",
        "todo",
      ],
      include_tag_ids: [
        "tag_01JC0000000000000000000001",
        "tag_01JC0000000000000000000001",
      ],
      exclude_tag_ids: [
        "tag_01JC0000000000000000000001",
      ],
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "name": "No errands",
  "mode": "browse",
  "filters": {
    "states": [
      "todo",
      "todo"
    ],
    "include_tag_ids": [
      "tag_01JC0000000000000000000001",
      "tag_01JC0000000000000000000001"
    ],
    "exclude_tag_ids": [
      "tag_01JC0000000000000000000001"
    ]
  }
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0JQY0ZX9NMEBJS374

{
  "result": {
    "view_id": "tvw_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

Replacing a view deletes what's no longer wanted, keeps what is and adds what's missing

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "view_id": "tvw_01JC0000000000000000000001",
  "name": "New",
  "mode": "queue",
  "filters": {
    "states": [
      "doing",
      "blocked"
    ],
    "include_tag_ids": [
      "tag_01JC0000000000000000000002"
    ]
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    view_id: "tvw_01JC0000000000000000000001",
    name: "New",
    mode: "queue",
    filters: {
      states: [
        "doing",
        "blocked",
      ],
      include_tag_ids: [
        "tag_01JC0000000000000000000002",
      ],
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "view_id": "tvw_01JC0000000000000000000001",
  "name": "New",
  "mode": "queue",
  "filters": {
    "states": [
      "doing",
      "blocked"
    ],
    "include_tag_ids": [
      "tag_01JC0000000000000000000002"
    ]
  }
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0F320C31TZZBV8V4K

{
  "result": {
    "view_id": "tvw_01JC0000000000000000000001"
  },
  "version": 1
}

Saving the same filters again changes only the view's own row

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "view_id": "tvw_01JC0000000000000000000001",
  "name": "Old",
  "mode": "browse",
  "filters": {
    "text": "old",
    "assignee_person_id": "per_01JC000000000000000000000A",
    "due_from": "2026-01-01",
    "states": [
      "doing",
      "todo"
    ],
    "priorities": [
      1
    ],
    "include_tag_ids": [
      "tag_01JC0000000000000000000001"
    ],
    "exclude_tag_ids": [
      "tag_01JC0000000000000000000002"
    ]
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    view_id: "tvw_01JC0000000000000000000001",
    name: "Old",
    mode: "browse",
    filters: {
      text: "old",
      assignee_person_id: "per_01JC000000000000000000000A",
      due_from: "2026-01-01",
      states: [
        "doing",
        "todo",
      ],
      priorities: [
        1,
      ],
      include_tag_ids: [
        "tag_01JC0000000000000000000001",
      ],
      exclude_tag_ids: [
        "tag_01JC0000000000000000000002",
      ],
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "view_id": "tvw_01JC0000000000000000000001",
  "name": "Old",
  "mode": "browse",
  "filters": {
    "text": "old",
    "assignee_person_id": "per_01JC000000000000000000000A",
    "due_from": "2026-01-01",
    "states": [
      "doing",
      "todo"
    ],
    "priorities": [
      1
    ],
    "include_tag_ids": [
      "tag_01JC0000000000000000000001"
    ],
    "exclude_tag_ids": [
      "tag_01JC0000000000000000000002"
    ]
  }
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0RAH91K5C5YXMMD5N

{
  "result": {
    "view_id": "tvw_01JC0000000000000000000001"
  },
  "version": 1
}

A view that isn't there

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "view_id": "tvw_01JC0000000000000000000001",
  "name": "X",
  "mode": "queue",
  "filters": {}
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    view_id: "tvw_01JC0000000000000000000001",
    name: "X",
    mode: "queue",
    filters: {},
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "view_id": "tvw_01JC0000000000000000000001",
  "name": "X",
  "mode": "queue",
  "filters": {}
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0VT9HPKBN9J8S88J0

{
  "error": {
    "code": "view_not_found",
    "message": "That view isn't there any more. No changes were applied.",
    "details": {
      "view_id": "tvw_01JC0000000000000000000001"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0VT9HPKBN9J8S88J0"
  }
}

An assignee that isn't there

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "name": "X",
  "mode": "queue",
  "filters": {
    "assignee_person_id": "per_01JC000000000000000000000A"
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    name: "X",
    mode: "queue",
    filters: {
      assignee_person_id: "per_01JC000000000000000000000A",
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "name": "X",
  "mode": "queue",
  "filters": {
    "assignee_person_id": "per_01JC000000000000000000000A"
  }
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0PZEKH0J2K807YGPK

{
  "error": {
    "code": "person_not_found",
    "message": "That person isn't in the household any more. No changes were applied.",
    "details": {
      "person_id": "per_01JC000000000000000000000A"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0PZEKH0J2K807YGPK"
  }
}

An included tag that isn't there

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "name": "X",
  "mode": "queue",
  "filters": {
    "include_tag_ids": [
      "tag_01JC0000000000000000000001"
    ]
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    name: "X",
    mode: "queue",
    filters: {
      include_tag_ids: [
        "tag_01JC0000000000000000000001",
      ],
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "name": "X",
  "mode": "queue",
  "filters": {
    "include_tag_ids": [
      "tag_01JC0000000000000000000001"
    ]
  }
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0W00ADVC3AS0QK23H

{
  "error": {
    "code": "tag_not_found",
    "message": "That tag isn't there any more. No changes were applied.",
    "details": {
      "tag_id": "tag_01JC0000000000000000000001"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0W00ADVC3AS0QK23H"
  }
}

An excluded tag that isn't there

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "name": "X",
  "mode": "queue",
  "filters": {
    "include_tag_ids": [
      "tag_01JC0000000000000000000001"
    ],
    "exclude_tag_ids": [
      "tag_01JC0000000000000000000002"
    ]
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    name: "X",
    mode: "queue",
    filters: {
      include_tag_ids: [
        "tag_01JC0000000000000000000001",
      ],
      exclude_tag_ids: [
        "tag_01JC0000000000000000000002",
      ],
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "name": "X",
  "mode": "queue",
  "filters": {
    "include_tag_ids": [
      "tag_01JC0000000000000000000001"
    ],
    "exclude_tag_ids": [
      "tag_01JC0000000000000000000002"
    ]
  }
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0CGHXGM4XVYA074ZH

{
  "error": {
    "code": "tag_not_found",
    "message": "That tag isn't there any more. No changes were applied.",
    "details": {
      "tag_id": "tag_01JC0000000000000000000002"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0CGHXGM4XVYA074ZH"
  }
}

A root task that isn't there

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "name": "X",
  "mode": "queue",
  "filters": {
    "root_task_id": "tsk_01JC0000000000000000000001"
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    name: "X",
    mode: "queue",
    filters: {
      root_task_id: "tsk_01JC0000000000000000000001",
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "name": "X",
  "mode": "queue",
  "filters": {
    "root_task_id": "tsk_01JC0000000000000000000001"
  }
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0CGT3B9CVFMRKRJED

{
  "error": {
    "code": "task_not_found",
    "message": "That task isn't there any more. No changes were applied.",
    "details": {
      "task_id": "tsk_01JC0000000000000000000001"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0CGT3B9CVFMRKRJED"
  }
}

Save a view

A name, a mode and filters. It shows as a tab.

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.view.save' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CT5B0PVQ3VEBKC4AVJMR' \
  -d '{
  "name": "Errands this month",
  "mode": "queue",
  "filters": {
    "include_tag_ids": [
      "tag_01M6V9CT2HYP2JXTPT7T98VN41"
    ],
    "due_to": "2026-12-07"
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.view.save", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CT5B0PVQ3VEBKC4AVJMR",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    name: "Errands this month",
    mode: "queue",
    filters: {
      include_tag_ids: [
        "tag_01M6V9CT2HYP2JXTPT7T98VN41",
      ],
      due_to: "2026-12-07",
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.view.save HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CT5B0PVQ3VEBKC4AVJMR

{
  "name": "Errands this month",
  "mode": "queue",
  "filters": {
    "include_tag_ids": [
      "tag_01M6V9CT2HYP2JXTPT7T98VN41"
    ],
    "due_to": "2026-12-07"
  }
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CT5B15ZWWFCZPV5TCH6Q

{
  "result": {
    "view_id": "tvw_01M6V9CT5BYG5MVM4XWVSYHNH2"
  },
  "version": 255
}

For Rigel#

Rigel's tool for this command is tasks_view_save. 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