Skip to content
Rigel docs
Open Rigel

Add a task

tasks.task.create

POST/api/v1/households/{household_id}/commands/tasks.task.create

  • Command
  • Rigel runs it
  • Applies offline

Adds one task, optionally as a subtask, with any fields filled in. Fill in only what was said; leave the rest out. Tags are by name and created as needed. The assignee and the person asking watch it. Search first (tasks.task.search) so you don't add a duplicate of an open task. Fails with task_not_found (parent or dependency), person_not_found, or dependency_cycle.

Parameters#

Add a task: 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.

Add a task: request body fields
FieldDescription
titlestringrequired

What needs doing, as written, 1–500 characters: "Call the pediatrician about Theo's rash".

at most 500 characters
descriptionstringoptional

More about the task, in Markdown, as written. Up to 20,000 characters.

at most 20,000 characters
priorityintegeroptional

0 Urgent, 1 High, 2 Medium, 3 Low, 4 Someday. Leave out unless someone said how important it is.

0 to 4
assignee_person_idstringoptional

Who's doing it: the person speaking unless someone else was named. Leave out when it's unclear.

due_datestring (date)optional

When it's due, YYYY-MM-DD. Leave out when no date was given.

scheduled_startstring (date-time)optional

When it's planned to be worked on. Give scheduled_end with it.

scheduled_endstring (date-time)optional

When the planned time ends, after scheduled_start.

tagsarray of stringsoptional

Tag names. Existing tags are matched ignoring case; others are created. Reuse existing tags.

at most 20 items
linksarray of stringsoptional

Records in other apps this task is about, such as a maintenance task or a document.

at most 20 items
parent_task_idstringoptional

The project or task this is a subtask of.

depends_on_task_idsarray of stringsoptional

Tasks that must be done before this one can start.

at most 50 items

Response#

200 The command was applied.

Add a task: response fields
FieldDescription
resultobjectrequired

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

result.task_idstringrequired

The new task.

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.

Add a task: errors
StatusCodeWhen
400validation_failedA field is missing, misspelled or out of range. details.fields lists each problem.
401unauthenticatedThe request has no valid session.
404task_not_found
  • A missing parent.
  • A missing dependency.
404person_not_foundA missing assignee.
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.

Adds a top-level task with just a title; I watch it

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

{
  "title": "Call the pediatrician"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0ABPFD2ZNRVFMFF59

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

Fills in every field, deduplicating tags, links and dependencies

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "title": "Pick up the rental keys",
  "description": "Bring ID.",
  "priority": 1,
  "assignee_person_id": "per_01JC000000000000000000000B",
  "due_date": "2025-11-14",
  "scheduled_start": "2025-11-10T14:00:00Z",
  "scheduled_end": "2025-11-10T15:00:00Z",
  "tags": [
    "Errands",
    "errands",
    "Outside"
  ],
  "links": [
    "fil_01JC00000000000000000000R1",
    "fil_01JC00000000000000000000R1",
    "fnt_01JC00000000000000000000R2"
  ],
  "depends_on_task_ids": [
    "tsk_01JC000000000000000000000X",
    "tsk_01JC000000000000000000000X"
  ]
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Pick up the rental keys",
    description: "Bring ID.",
    priority: 1,
    assignee_person_id: "per_01JC000000000000000000000B",
    due_date: "2025-11-14",
    scheduled_start: "2025-11-10T14:00:00Z",
    scheduled_end: "2025-11-10T15:00:00Z",
    tags: [
      "Errands",
      "errands",
      "Outside",
    ],
    links: [
      "fil_01JC00000000000000000000R1",
      "fil_01JC00000000000000000000R1",
      "fnt_01JC00000000000000000000R2",
    ],
    depends_on_task_ids: [
      "tsk_01JC000000000000000000000X",
      "tsk_01JC000000000000000000000X",
    ],
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "title": "Pick up the rental keys",
  "description": "Bring ID.",
  "priority": 1,
  "assignee_person_id": "per_01JC000000000000000000000B",
  "due_date": "2025-11-14",
  "scheduled_start": "2025-11-10T14:00:00Z",
  "scheduled_end": "2025-11-10T15:00:00Z",
  "tags": [
    "Errands",
    "errands",
    "Outside"
  ],
  "links": [
    "fil_01JC00000000000000000000R1",
    "fil_01JC00000000000000000000R1",
    "fnt_01JC00000000000000000000R2"
  ],
  "depends_on_task_ids": [
    "tsk_01JC000000000000000000000X",
    "tsk_01JC000000000000000000000X"
  ]
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R04ZWMSQJMDB8T4TVT

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

An assigned task tells the assignee who gave it

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

{
  "title": "Take out the recycling",
  "assignee_person_id": "per_01JC000000000000000000000B"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0PVTNV687HZCHBMKM

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

Assigning it to myself watches it and notifies no one

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

{
  "title": "Renew passports",
  "assignee_person_id": "per_01JC000000000000000000000A"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0NM5E3YXYS13B4V31

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

An assignee without an account watches but is not notified

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

{
  "title": "Pick up toys",
  "assignee_person_id": "per_01JC000000000000000000000C"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0WJDERP4JK21YGFZ5

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

An actor with no person watches nothing

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

{
  "title": "Check the smoke detectors",
  "assignee_person_id": "per_01JC000000000000000000000B"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0CFPSGNR76G96J33M

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

The notification title is cut to 120 characters

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "title": "Plan the summer trip: book flights, find a rental near the lake, ask the grandparents which weeks work, and check passports check passports check passports check passports check passports ",
  "assignee_person_id": "per_01JC000000000000000000000B",
  "due_date": "2025-11-10"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Plan the summer trip: book flights, find a rental near the lake, ask the grandparents which weeks work, and check passports check passports check passports check passports check passports ",
    assignee_person_id: "per_01JC000000000000000000000B",
    due_date: "2025-11-10",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "title": "Plan the summer trip: book flights, find a rental near the lake, ask the grandparents which weeks work, and check passports check passports check passports check passports check passports ",
  "assignee_person_id": "per_01JC000000000000000000000B",
  "due_date": "2025-11-10"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0Y1WH1W86Y284K78H

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

A due date already past schedules no overdue reminder

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "title": "File the form",
  "assignee_person_id": "per_01JC000000000000000000000B",
  "due_date": "2025-11-04"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "File the form",
    assignee_person_id: "per_01JC000000000000000000000B",
    due_date: "2025-11-04",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "title": "File the form",
  "assignee_person_id": "per_01JC000000000000000000000B",
  "due_date": "2025-11-04"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0KT162SVZTH05ENGB

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

A due date with no assignee schedules no overdue reminder

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "title": "Pay the water bill",
  "due_date": "2025-11-14"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Pay the water bill",
    due_date: "2025-11-14",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "title": "Pay the water bill",
  "due_date": "2025-11-14"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0P2BMTGN1MCHQHXJ7

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

A first subtask gets a sort key

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

{
  "title": "Buy paint",
  "parent_task_id": "tsk_01JC000000000000000000000P"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0QZGFFG7HRAQGH426

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

A subtask goes after the last sibling that has a key

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

{
  "title": "Hang curtains",
  "parent_task_id": "tsk_01JC000000000000000000000P"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R092BTWE714VJ95E85

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

Empty lists add nothing

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "title": "Water the plants",
  "tags": [],
  "links": [],
  "depends_on_task_ids": []
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Water the plants",
    tags: [],
    links: [],
    depends_on_task_ids: [],
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "title": "Water the plants",
  "tags": [],
  "links": [],
  "depends_on_task_ids": []
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R087GR7SV03QN8GPVV

{
  "result": {
    "task_id": "tsk_01JC4N0000MBGE5RJ6Q7V6V6T8"
  },
  "version": 1
}

A missing parent

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

{
  "title": "Orphan",
  "parent_task_id": "tsk_01JC000000000000000000000Z"
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0GB3AG7QW9H723ZF0

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

A missing assignee

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

{
  "title": "Nobody's",
  "assignee_person_id": "per_01JC000000000000000000000Z"
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R02C3STD619H5V339Q

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

A missing dependency

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

{
  "title": "Waits",
  "depends_on_task_ids": [
    "tsk_01JC000000000000000000000X",
    "tsk_01JC000000000000000000000Z"
  ]
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R07HB9Z694SZYKT38D

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

Add a task

Only a title is needed. Leave out anything nobody said.

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CT2FF9CQMMST6C13HF64' \
  -d '{
  "title": "Book Theo'\''s flu shot"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CT2FF9CQMMST6C13HF64",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Book Theo's flu shot",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CT2FF9CQMMST6C13HF64

{
  "title": "Book Theo's flu shot"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CT2FY2T4KASJPSQEETH6

{
  "result": {
    "task_id": "tsk_01M6V9CT2FB0DD6W26P2MTCZPP"
  },
  "version": 229
}

Add a task for someone with a date and a tag

Tags are given by name and made if they're new. The assignee is notified, and starts watching the task.

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CT2HZE3WZGJ88FGK3FPH' \
  -d '{
  "title": "Renew the car registration",
  "description": "The renewal notice is in the kitchen drawer.",
  "priority": 1,
  "assignee_person_id": "per_01M6V9CS744BQQH188FS6CXY9W",
  "due_date": "2026-11-19",
  "tags": [
    "errands"
  ]
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CT2HZE3WZGJ88FGK3FPH",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Renew the car registration",
    description: "The renewal notice is in the kitchen drawer.",
    priority: 1,
    assignee_person_id: "per_01M6V9CS744BQQH188FS6CXY9W",
    due_date: "2026-11-19",
    tags: [
      "errands",
    ],
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CT2HZE3WZGJ88FGK3FPH

{
  "title": "Renew the car registration",
  "description": "The renewal notice is in the kitchen drawer.",
  "priority": 1,
  "assignee_person_id": "per_01M6V9CS744BQQH188FS6CXY9W",
  "due_date": "2026-11-19",
  "tags": [
    "errands"
  ]
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CT2HWC2F1FJ3395DC85M

{
  "result": {
    "task_id": "tsk_01M6V9CT2HD6NKJXPTTWJTBTYS"
  },
  "version": 230
}

Add a task about a record in another app

links are IDs of records in other apps, here the dentist appointment on the calendar.

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CT2M6YVST3ZTP95P9KDW' \
  -d '{
  "title": "Bring the insurance card to Nia'\''s dentist visit",
  "assignee_person_id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
  "due_date": "2026-11-12",
  "priority": 2,
  "links": [
    "evt_01M6V9CSHWH4PNSMGCX1WKFWDT"
  ],
  "tags": [
    "kids"
  ]
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CT2M6YVST3ZTP95P9KDW",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Bring the insurance card to Nia's dentist visit",
    assignee_person_id: "per_01M6V9CS6RX26JK5KVYGRN22D2",
    due_date: "2026-11-12",
    priority: 2,
    links: [
      "evt_01M6V9CSHWH4PNSMGCX1WKFWDT",
    ],
    tags: [
      "kids",
    ],
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CT2M6YVST3ZTP95P9KDW

{
  "title": "Bring the insurance card to Nia's dentist visit",
  "assignee_person_id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
  "due_date": "2026-11-12",
  "priority": 2,
  "links": [
    "evt_01M6V9CSHWH4PNSMGCX1WKFWDT"
  ],
  "tags": [
    "kids"
  ]
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CT2M1Z7XZC827ZPHZ9MT

{
  "result": {
    "task_id": "tsk_01M6V9CT2MF45K5TH7J6PBE1SJ"
  },
  "version": 231
}

Add a chore for a child

Assignees are people in the family, so a child who never signs in can have a task.

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CT2QWTPQ9JYTHVJS0JWH' \
  -d '{
  "title": "Put toys away",
  "description": "In the bins by the window, not the closet.",
  "assignee_person_id": "per_01M6V9CS7CDAEP5VDA5T8R9TG6",
  "due_date": "2026-11-08",
  "tags": [
    "chores",
    "kids"
  ]
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CT2QWTPQ9JYTHVJS0JWH",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Put toys away",
    description: "In the bins by the window, not the closet.",
    assignee_person_id: "per_01M6V9CS7CDAEP5VDA5T8R9TG6",
    due_date: "2026-11-08",
    tags: [
      "chores",
      "kids",
    ],
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CT2QWTPQ9JYTHVJS0JWH

{
  "title": "Put toys away",
  "description": "In the bins by the window, not the closet.",
  "assignee_person_id": "per_01M6V9CS7CDAEP5VDA5T8R9TG6",
  "due_date": "2026-11-08",
  "tags": [
    "chores",
    "kids"
  ]
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CT2QW38P3W810JA17RSQ

{
  "result": {
    "task_id": "tsk_01M6V9CT2QVG1D1T82PW3837ZG"
  },
  "version": 232
}

Add another chore

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CT2TB7YXS1EF8ZRRA5HN' \
  -d '{
  "title": "Sweep the kitchen floor",
  "assignee_person_id": "per_01M6V9CS79TMYHDAM7FTA9ZK3Z",
  "priority": 3,
  "tags": [
    "chores"
  ]
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CT2TB7YXS1EF8ZRRA5HN",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Sweep the kitchen floor",
    assignee_person_id: "per_01M6V9CS79TMYHDAM7FTA9ZK3Z",
    priority: 3,
    tags: [
      "chores",
    ],
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CT2TB7YXS1EF8ZRRA5HN

{
  "title": "Sweep the kitchen floor",
  "assignee_person_id": "per_01M6V9CS79TMYHDAM7FTA9ZK3Z",
  "priority": 3,
  "tags": [
    "chores"
  ]
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CT2T3D74QW6E1E2Z0V7F

{
  "result": {
    "task_id": "tsk_01M6V9CT2THMCHK2K7S32C9WNN"
  },
  "version": 233
}

Add a task for someday

Priority 4 is Someday: it stays in the queue, after everything more important.

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CT2WYTA7KHM0MGXEMJ8F' \
  -d '{
  "title": "Sort the garage shelves",
  "priority": 4,
  "tags": [
    "house",
    "outside"
  ]
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CT2WYTA7KHM0MGXEMJ8F",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Sort the garage shelves",
    priority: 4,
    tags: [
      "house",
      "outside",
    ],
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/tasks.task.create HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CT2WYTA7KHM0MGXEMJ8F

{
  "title": "Sort the garage shelves",
  "priority": 4,
  "tags": [
    "house",
    "outside"
  ]
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CT2WQ2BACQQQDRR54VHX

{
  "result": {
    "task_id": "tsk_01M6V9CT2WE5GCAQSQTW3MTXV7"
  },
  "version": 234
}

For Rigel#

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