Skip to content
Rigel docs
Open Rigel

Change a maintenance task

maintenance.task.update

POST/api/v1/households/{household_id}/commands/maintenance.task.update

  • Command
  • Rigel runs it
  • Applies offline

Changes only the fields given; null clears a field that can be empty. Changing timing counts the next due date again from the last completion (or by the first-due rules) unless next_due_on is given. Giving cost replaces all its estimates, and giving evidence replaces the source. asset_id and location_id move the task; null on one of them makes it a whole-home task. A task that's turned off keeps no due date. Fails with one_subject, different_property, invalid_timing or invalid_range.

Parameters#

Change a maintenance 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.

Change a maintenance task: request body fields
FieldDescription
task_idstringrequired

The task to change.

asset_idstring or nulloptional

Move the task to this item; null with no place makes it a whole-home task.

location_idstring or nulloptional

Move the task to this place; null with no item makes it a whole-home task.

titlestringoptional

What to do, in a few words: "Replace the furnace filter".

at most 200 characters
summarystring or nulloptional

What it is, in a sentence or two of plain words.

at most 20,000 characters
whystring or nulloptional

What goes wrong if it's skipped, with a rough cost of the failure where known.

at most 20,000 characters
timingone of 5 shapesoptional

How the task repeats. Exactly one kind.

Shape 1
timing.kindone of: intervalrequired

Counted from when it was last done.

timing.everyintegerrequired

How many units between one time and the next.

1 to 1,200
timing.unitone of: day, week, month, yearrequired

The unit of the interval: day, week, month or year.

Shape 2, with month_day
timing.kindone of: anchoredrequired

On a fixed day of the year, kept even when done late or early.

timing.month_daystringrequired

The anchor day, MM-DD, such as 09-15.

pattern ^(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
timing.everyintegeroptional

How many units between anchor dates. Defaults to 1.

1 to 100
timing.unitone of: month, yearoptional

month or year. Defaults to year.

Shape 3, with start, end
timing.kindone of: seasonalrequired

Once a year, in a window that may wrap the new year.

timing.startstringrequired

When the window opens, MM-DD.

pattern ^(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
timing.endstringrequired

When the window closes, MM-DD. May be earlier in the year than start (11-15 to 02-15).

pattern ^(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
timing.reasoningstringoptional

Why the window is where it is, shown on the task page so the household can move it.

at most 2,000 characters
Shape 4, with rule
timing.kindone of: usagerequired

When a reading or a check says so; shows as Check until given a date.

timing.rulestringrequired

When it's due, in words: "every 100 hours", "when the salt is low".

at most 200 characters
Shape 5
timing.kindone of: oncerequired

Done for good once checked off.

importanceone of: essential, recommended, optionaloptional

essential (skipping it risks damage, safety, a voided warranty or an expensive repair; stays visible when overdue), recommended (meaningfully extends life or efficiency, and people actually do it), optional (nice to do; only on the asset page, never comes due).

next_due_onstring (date) or nulloptional

Set the next due date directly; null clears it.

diy_stepsstring or nulloptional

Markdown: steps, tools, supplies, time needed, and the signs that mean you should call a pro. Leave out when DIY isn't reasonable.

at most 20,000 characters
hire_guidancestring or nulloptional

Markdown: the kind of contractor and what to ask for.

at most 20,000 characters
costobject or nulloptional

Cost estimates as ranges. Sending cost replaces all of the task's estimates.

cost.currencystringrequired

An ISO 4217 currency code, such as USD.

pattern ^[A-Z]{3}$
cost.diy_minintegeroptional

Lowest cost to do it yourself, in minor units (cents).

0 to 1,000,000,000
cost.diy_maxintegeroptional

Highest cost to do it yourself, in minor units.

0 to 1,000,000,000
cost.hire_minintegeroptional

Lowest cost to hire it out, in minor units.

0 to 1,000,000,000
cost.hire_maxintegeroptional

Highest cost to hire it out, in minor units.

0 to 1,000,000,000
cost.basisstringoptional

Where the estimate comes from: place, date and source.

at most 500 characters
handled_byone of: diy, hire, service, null or nulloptional

How the household handles it: diy (does it themselves), hire (calls someone), service (covered by a service plan).

handling_notestring or nulloptional

The household's plan, such as "Call Lakes Region HVAC to schedule."

at most 2,000 characters
contractor_idstring or nulloptional

A contractor ID, such as ctr_01JC0000000000000000000000.

assignee_person_idstring or nulloptional

A person ID, such as per_01JC0000000000000000000000.

house_notesstring or nulloptional

Anything specific to this home: "shutoff is behind the water heater".

at most 20,000 characters
evidenceobject or nulloptional

Where the task came from; null clears it.

evidence.file_idstringoptional

A photo, manual or invoice already uploaded to the household's files.

evidence.urlstring (uri)optional

A web address.

at most 2,000 characters
evidence.said_by_person_idstringoptional

Who said it, when the source is something a person said.

evidence.locatorstringoptional

Where in the source: "p. 14", "rating plate".

at most 200 characters
evidence.excerptstringoptional

The exact text the value was read from.

at most 2,000 characters

Response#

200 The command was applied.

Change a maintenance task: response fields
FieldDescription
resultobjectrequired

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

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.

Change a maintenance task: errors
StatusCodeWhen
400validation_failedA field is missing, misspelled or out of range. details.fields lists each problem.
401unauthenticatedThe request has no valid session.
404contractor_not_foundRejects an unknown contractor.
404person_not_foundRejects an unknown assignee.
404task_not_foundRejects an unknown task.
404not_foundThe household doesn't exist, or you aren't a member of it.
409one_subjectRejects an item and a place together.
409different_propertyRejects an item at another property.
409invalid_rangeRejects a reversed cost range.
409invalid_timingRejects a one-day window.
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.

Changes only what's given

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

{
  "task_id": "mtk_01JC0000000000000000000001",
  "title": "Change the furnace filter",
  "handled_by": "diy"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0SXNAZZPMXKYD48N9

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

Null clears a field

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA0Q' \
  -d '{
  "task_id": "mtk_01JC0000000000000000000001",
  "summary": null,
  "handled_by": null,
  "cost": null
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAA0Q",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    task_id: "mtk_01JC0000000000000000000001",
    summary: null,
    handled_by: null,
    cost: null,
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA0Q

{
  "task_id": "mtk_01JC0000000000000000000001",
  "summary": null,
  "handled_by": null,
  "cost": null
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0XDMJNJHMRPTTXMW9

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

New timing counts the due date again from the last completion

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA0R' \
  -d '{
  "task_id": "mtk_01JC0000000000000000000001",
  "timing": {
    "kind": "interval",
    "every": 6,
    "unit": "month"
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAA0R",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    task_id: "mtk_01JC0000000000000000000001",
    timing: {
      kind: "interval",
      every: 6,
      unit: "month",
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA0R

{
  "task_id": "mtk_01JC0000000000000000000001",
  "timing": {
    "kind": "interval",
    "every": 6,
    "unit": "month"
  }
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0AEYCEFWH950NYFX2

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

A next_due_on given with new timing wins

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA0S' \
  -d '{
  "task_id": "mtk_01JC0000000000000000000001",
  "timing": {
    "kind": "interval",
    "every": 1,
    "unit": "month"
  },
  "next_due_on": "2025-12-12"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAA0S",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    task_id: "mtk_01JC0000000000000000000001",
    timing: {
      kind: "interval",
      every: 1,
      unit: "month",
    },
    next_due_on: "2025-12-12",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA0S

{
  "task_id": "mtk_01JC0000000000000000000001",
  "timing": {
    "kind": "interval",
    "every": 1,
    "unit": "month"
  },
  "next_due_on": "2025-12-12"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R072V30M6NYP9NQES9

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

Switching to an anchored task with no history waits for the next anchor

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA0T' \
  -d '{
  "task_id": "mtk_01JC0000000000000000000001",
  "timing": {
    "kind": "anchored",
    "month_day": "09-15"
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAA0T",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    task_id: "mtk_01JC0000000000000000000001",
    timing: {
      kind: "anchored",
      month_day: "09-15",
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA0T

{
  "task_id": "mtk_01JC0000000000000000000001",
  "timing": {
    "kind": "anchored",
    "month_day": "09-15"
  }
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0D895TDWQ0MBHZPAS

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

Moving to an item

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

{
  "task_id": "mtk_01JC0000000000000000000001",
  "asset_id": "ast_01JC0000000000000000000001"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0CS26FBWZBF6FA53X

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

Moving to a place leaves the item

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

{
  "task_id": "mtk_01JC0000000000000000000001",
  "location_id": "mlc_01JC0000000000000000000001"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0FKJE2DAPT8CAM72K

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

Null on the item makes it a whole-home task

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

{
  "task_id": "mtk_01JC0000000000000000000001",
  "asset_id": null
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0RVQ97CEQP2KW77FB

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

New evidence replaces the source

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA0Z' \
  -d '{
  "task_id": "mtk_01JC0000000000000000000001",
  "evidence": {
    "locator": "p. 3"
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAA0Z",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    task_id: "mtk_01JC0000000000000000000001",
    evidence: {
      locator: "p. 3",
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA0Z

{
  "task_id": "mtk_01JC0000000000000000000001",
  "evidence": {
    "locator": "p. 3"
  }
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R07CPH6348NADJDPR4

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

A task that is off keeps no due date

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA10' \
  -d '{
  "task_id": "mtk_01JC0000000000000000000001",
  "timing": {
    "kind": "interval",
    "every": 1,
    "unit": "year"
  },
  "next_due_on": "2026-01-01"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAA10",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    task_id: "mtk_01JC0000000000000000000001",
    timing: {
      kind: "interval",
      every: 1,
      unit: "year",
    },
    next_due_on: "2026-01-01",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA10

{
  "task_id": "mtk_01JC0000000000000000000001",
  "timing": {
    "kind": "interval",
    "every": 1,
    "unit": "year"
  },
  "next_due_on": "2026-01-01"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0XCA8QYPVXRSVXJAZ

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

Importance can change

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

{
  "task_id": "mtk_01JC0000000000000000000001",
  "importance": "essential"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0SM4A903RH33DPMFF

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

Rejects an item and a place together

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA12' \
  -d '{
  "task_id": "mtk_01JC0000000000000000000001",
  "asset_id": "ast_01JC0000000000000000000001",
  "location_id": "mlc_01JC0000000000000000000001"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAA12",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    task_id: "mtk_01JC0000000000000000000001",
    asset_id: "ast_01JC0000000000000000000001",
    location_id: "mlc_01JC0000000000000000000001",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA12

{
  "task_id": "mtk_01JC0000000000000000000001",
  "asset_id": "ast_01JC0000000000000000000001",
  "location_id": "mlc_01JC0000000000000000000001"
}
Response, 409
HTTP/1.1 409 Conflict
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0Z9EPR1XHN1W9DGBD

{
  "error": {
    "code": "one_subject",
    "message": "Give an asset or a place, not both. No changes were applied.",
    "details": {},
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0Z9EPR1XHN1W9DGBD"
  }
}

Rejects an item at another property

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

{
  "task_id": "mtk_01JC0000000000000000000001",
  "asset_id": "ast_01JC0000000000000000000002"
}
Response, 409
HTTP/1.1 409 Conflict
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0PNFD2R9YC1J66CAA

{
  "error": {
    "code": "different_property",
    "message": "That item is at a different property. No changes were applied.",
    "details": {
      "property_id": "prp_01JC0000000000000000000002"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0PNFD2R9YC1J66CAA"
  }
}

Rejects a reversed cost range

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA14' \
  -d '{
  "task_id": "mtk_01JC0000000000000000000001",
  "cost": {
    "currency": "USD",
    "diy_min": 9,
    "diy_max": 1
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAA14",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    task_id: "mtk_01JC0000000000000000000001",
    cost: {
      currency: "USD",
      diy_min: 9,
      diy_max: 1,
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA14

{
  "task_id": "mtk_01JC0000000000000000000001",
  "cost": {
    "currency": "USD",
    "diy_min": 9,
    "diy_max": 1
  }
}
Response, 409
HTTP/1.1 409 Conflict
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0WDF7C1G4B0Y8Y6GJ

{
  "error": {
    "code": "invalid_range",
    "message": "The lowest do-it-yourself cost is higher than the highest. No changes were applied.",
    "details": {},
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0WDF7C1G4B0Y8Y6GJ"
  }
}

Rejects a one-day window

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA15' \
  -d '{
  "task_id": "mtk_01JC0000000000000000000001",
  "timing": {
    "kind": "seasonal",
    "start": "03-01",
    "end": "03-01"
  }
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAA15",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    task_id: "mtk_01JC0000000000000000000001",
    timing: {
      kind: "seasonal",
      start: "03-01",
      end: "03-01",
    },
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/maintenance.task.update HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAA15

{
  "task_id": "mtk_01JC0000000000000000000001",
  "timing": {
    "kind": "seasonal",
    "start": "03-01",
    "end": "03-01"
  }
}
Response, 409
HTTP/1.1 409 Conflict
Content-Type: application/json
X-Request-Id: req_01K9D9S2R01FZGV2RF5F796XFB

{
  "error": {
    "code": "invalid_timing",
    "message": "A season window needs different start and end days. No changes were applied.",
    "details": {},
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R01FZGV2RF5F796XFB"
  }
}

Rejects an unknown contractor

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

{
  "task_id": "mtk_01JC0000000000000000000001",
  "contractor_id": "ctr_01JC0000000000000000000001"
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R07J7BERB638A2W317

{
  "error": {
    "code": "contractor_not_found",
    "message": "That contractor isn't there any more. No changes were applied.",
    "details": {
      "contractor_id": "ctr_01JC0000000000000000000001"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R07J7BERB638A2W317"
  }
}

Rejects an unknown assignee

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

{
  "task_id": "mtk_01JC0000000000000000000001",
  "assignee_person_id": "per_01JC0000000000000000000001"
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0HWDT79862BZQDHRV

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

Rejects an unknown task

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

{
  "task_id": "mtk_01JC0000000000000000000001",
  "title": "x"
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R06P23KHPXKX0K2GAQ

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

Change a task's next due date

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/maintenance.task.update' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CSXFTBV0GJJA4NE8AYS7' \
  -d '{
  "task_id": "mtk_01M6V9CSWSHKH0MYE1RMRRDC58",
  "next_due_on": "2026-11-19",
  "summary": "Book the same week as the tune-up."
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/maintenance.task.update", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CSXFTBV0GJJA4NE8AYS7",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    task_id: "mtk_01M6V9CSWSHKH0MYE1RMRRDC58",
    next_due_on: "2026-11-19",
    summary: "Book the same week as the tune-up.",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/maintenance.task.update HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CSXFTBV0GJJA4NE8AYS7

{
  "task_id": "mtk_01M6V9CSWSHKH0MYE1RMRRDC58",
  "next_due_on": "2026-11-19",
  "summary": "Book the same week as the tune-up."
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CSXGEY2T0JWQA7934FRT

{
  "result": {},
  "version": 202
}

For Rigel#

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