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#
| Field | Description |
|---|---|
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.
| Field | Description |
|---|---|
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". |
summarystring or nulloptional | What it is, in a sentence or two of plain words. |
whystring or nulloptional | What goes wrong if it's skipped, with a rough cost of the failure where known. |
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. |
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. |
timing.everyintegeroptional | How many units between anchor dates. Defaults to 1. |
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. |
timing.endstringrequired | When the window closes, MM-DD. May be earlier in the year than start (11-15 to 02-15). |
timing.reasoningstringoptional | Why the window is where it is, shown on the task page so the household can move it. |
| 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". |
| 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. |
hire_guidancestring or nulloptional | Markdown: the kind of contractor and what to ask for. |
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. |
cost.diy_minintegeroptional | Lowest cost to do it yourself, in minor units (cents). |
cost.diy_maxintegeroptional | Highest cost to do it yourself, in minor units. |
cost.hire_minintegeroptional | Lowest cost to hire it out, in minor units. |
cost.hire_maxintegeroptional | Highest cost to hire it out, in minor units. |
cost.basisstringoptional | Where the estimate comes from: place, date and source. |
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." |
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". |
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. |
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". |
evidence.excerptstringoptional | The exact text the value was read from. |
Response#
200 The command was applied.
| Field | Description |
|---|---|
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.
| Status | Code | When |
|---|---|---|
400 | validation_failed | A field is missing, misspelled or out of range. details.fields lists each problem. |
401 | unauthenticated | The request has no valid session. |
404 | contractor_not_found | Rejects an unknown contractor. |
404 | person_not_found | Rejects an unknown assignee. |
404 | task_not_found | Rejects an unknown task. |
404 | not_found | The household doesn't exist, or you aren't a member of it. |
409 | one_subject | Rejects an item and a place together. |
409 | different_property | Rejects an item at another property. |
409 | invalid_range | Rejects a reversed cost range. |
409 | invalid_timing | Rejects a one-day window. |
409 | idempotency_key_reused | The 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
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"
}'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();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"
}HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0SXNAZZPMXKYD48N9
{
"result": {},
"version": 1
}Null clears a field
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
}'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();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
}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
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"
}
}'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();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"
}
}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
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"
}'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();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"
}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
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"
}
}'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();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"
}
}HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0D895TDWQ0MBHZPAS
{
"result": {},
"version": 1
}Moving to an item
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"
}'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();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"
}HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0CS26FBWZBF6FA53X
{
"result": {},
"version": 1
}Moving to a place leaves the item
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"
}'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();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"
}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
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
}'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();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
}HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0RVQ97CEQP2KW77FB
{
"result": {},
"version": 1
}New evidence replaces the source
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"
}
}'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();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"
}
}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
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"
}'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();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"
}HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0XCA8QYPVXRSVXJAZ
{
"result": {},
"version": 1
}Importance can change
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"
}'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();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"
}HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0SM4A903RH33DPMFF
{
"result": {},
"version": 1
}Rejects an item and a place together
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"
}'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();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"
}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
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"
}'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();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"
}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
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
}
}'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();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
}
}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
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"
}
}'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();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"
}
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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."
}'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();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."
}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.