Everything about one item
maintenance.asset.get
GET/api/v1/households/{household_id}/queries/maintenance.asset.get
- Query
- Rigel runs it
One asset: its identity, place, group and members, model, photos, specs resolved with where each came from (the asset's own, its group's, its model's), the spec keys for its kind that are Not found yet, parts that fit, warranties, maintenance tasks with when they are due, open problems, visits, label readings with the other model numbers they could be, other items with the same serial, and what replaced it or what it replaced.
Parameters#
| Field | Description |
|---|---|
household_idpathstringrequired | The household's ID. |
asset_idquerystringrequired | A asset ID, such as ast_01JC0000000000000000000000. |
Response#
200 The answer.
| Field | Description |
|---|---|
idstringrequired | A asset ID, such as ast_01JC0000000000000000000000. |
addressstring or nullrequired | The web route that opens it. |
namestringrequired | What the household calls it. |
property_idstringrequired | A property ID, such as prp_01JC0000000000000000000000. |
property_namestringrequired | The property it is at. |
location_idstring or nullrequired | The place it is in. |
location_namestring or nullrequired | The place it is in, with the places that contain it. |
category_idstringrequired | A maintenance category ID, such as cat_01JC0000000000000000000000. |
category_keystring or nullrequired | The curated category key; null for a one-off category. |
category_namestringrequired | The category's name. |
statusone of: partial, researching, identified, needs_inputrequired | partial (known by name, not identified yet), researching (Rigel is looking up the model), identified (the model is known), needs_input (Rigel couldn't verify the model and needs a closer label photo or a choice). |
serialstring or nullrequired | Its serial number. |
installed_onstring or nullrequired | When it was installed: YYYY-MM-DD, YYYY-MM or YYYY. |
installed_precisionone of: day, month, year, approximate, null or nullrequired | How exact installed_on is. |
quantityintegerrequired | How many identical items this record stands for. |
notesstring or nullrequired | Notes, as written. |
retired_onstring or nullrequired | When it was retired; null while in service. |
modelobject or nullrequired | Its model, once identified. |
model.idstringrequired | A equipment model ID, such as eqm_01JC0000000000000000000000. |
model.manufacturerstring or nullrequired | The maker. |
model.model_numberstring or nullrequired | The complete model number, exactly as printed. |
model.variantstring or nullrequired | A variant that changes compatibility or specs. |
model.labelstring or nullrequired | Maker, model number and variant together, such as "Carrier 59SC5A060S17". |
groupobject or nullrequired | The group it belongs to (such as the HVAC system), whose facts it shares. |
group.idstringrequired | A asset ID, such as ast_01JC0000000000000000000000. |
group.namestringrequired | The group's name. |
group.modelobject or nullrequired | |
group.model.idstringrequired | A equipment model ID, such as eqm_01JC0000000000000000000000. |
group.model.manufacturerstring or nullrequired | The maker. |
group.model.model_numberstring or nullrequired | The complete model number, exactly as printed. |
group.model.variantstring or nullrequired | A variant that changes compatibility or specs. |
group.model.labelstring or nullrequired | Maker, model number and variant together, such as "Carrier 59SC5A060S17". |
membersarray of objectsrequired | Items that belong to this one as a group. |
members[].idstringrequired | A asset ID, such as ast_01JC0000000000000000000000. |
members[].namestringrequired | The member's name. |
members[].statusone of: partial, researching, identified, needs_inputrequired | partial (known by name, not identified yet), researching (Rigel is looking up the model), identified (the model is known), needs_input (Rigel couldn't verify the model and needs a closer label photo or a choice). |
members[].retired_onstring or nullrequired | When it was retired. |
photosarray of objectsrequired | |
photos[].idstringrequired | A asset photo ID, such as aph_01JC0000000000000000000000. |
photos[].file_idstringrequired | A file ID, such as fil_01JC0000000000000000000000. |
photos[].roleone of: unit, label, damage, otherrequired | What the photo shows: unit (the equipment itself), label (its brand, model or rating sticker), damage (a problem), other. |
photos[].captionstring or nullrequired | The caption. |
photos[].created_atstring (date-time)required | When the photo was added. |
specsarray of objectsrequired | Resolved facts, by key: the first of the asset, group, model and group's model that has it. |
specs[].attribute_idstringrequired | The fact's ID (atr_…). |
specs[].keystringrequired | The fact key, such as filter_size or capacity. |
specs[].labelstringrequired | The key as a person reads it, such as Filter size. |
specs[].valuestring or nullrequired | The text value, if any. |
specs[].value_numnumber or nullrequired | The numeric value, if any. |
specs[].unitstring or nullrequired | The unit of value_num in the catalog's snake_case, such as in or btu_per_hour. |
specs[].in_wordsstringrequired | The value with its unit as a person reads it, such as "40 gal". |
specs[].originone of: homeowner, label, research, generalrequired | How it was established: homeowner, label, research or general. |
specs[].origin_in_wordsstringrequired | The origin as a person reads it, such as "From the label". |
specs[].evidence_idstring or nullrequired | The evidence (evi_…) it rests on, if any. |
specs[].sourceone of: asset, group, model, group_model, propertyrequired | Whose fact it is: the asset itself, its group, its model, its group's model, or the property. A group or model fact is shared by every asset it covers. |
manualsarray of objectsrequired | Manuals Rigel found for the model (also in specs), each with the page to open. Only those with a page. |
manuals[].keyone of: owners_manual, installation_manualrequired | Which manual. |
manuals[].titlestringrequired | The manual's title. |
manuals[].urlstringrequired | The web page it was found on. |
missing_specsarray of objectsrequired | Spec keys worth knowing for this kind of item that have no value yet. Fill them from the label or research, never guess. |
missing_specs[].keystringrequired | The fact key. |
missing_specs[].labelstringrequired | Its label. |
missing_specs[].unitstring or nullrequired | The unit to record a number in. |
missing_specs[].notestringrequired | Always "Not found yet". |
partsarray of objectsrequired | |
parts[].part_idstringrequired | A part ID, such as prt_01JC0000000000000000000000. |
parts[].namestringrequired | The part's name. |
parts[].manufacturerstring or nullrequired | Its maker. |
parts[].part_numberstring or nullrequired | Its part number. |
parts[].descriptionstring or nullrequired | Size and how many it takes. |
parts[].is_oemboolean or nullrequired | True for the maker's own part; null when unknown. |
parts[].purchase_urlstring or nullrequired | A place to buy it. A link doesn't prove it fits. |
parts[].product_idstring or nullrequired | The inventory product it is, when linked: ask |
parts[].product_namestring or nullrequired | That product's name in the household's words. |
parts[].fitsone of: model, assetrequired | Whether it fits this item's model or this item in particular. |
parts[].evidence_idstring or nullrequired | What says it fits. |
warrantiesarray of objectsrequired | |
warranties[].idstringrequired | A warranty ID, such as wty_01JC0000000000000000000000. |
warranties[].providerstring or nullrequired | Who provides it. |
warranties[].coveragestring or nullrequired | What it covers. |
warranties[].starts_onstring or nullrequired | When it starts. |
warranties[].ends_onstring or nullrequired | When it ends. |
tasksarray of objectsrequired | Its maintenance tasks, including optional and turned-off ones, soonest first. |
tasks[].idstringrequired | The task's ID (mtk_…). |
tasks[].addressstring or nullrequired | The web route that opens the task, when it has one. |
tasks[].titlestringrequired | The task's title. |
tasks[].importanceone of: essential, recommended, optionalrequired | How much it matters. |
tasks[].statusone of: active, offrequired | Whether the task is on or turned off. |
tasks[].next_due_onstring or nullrequired | When it is next due, YYYY-MM-DD, or null (a usage task with no date). |
tasks[].due_groupone of: overdue, due_soon, this_season, later, null or nullrequired | Overdue, due_soon (within 2 weeks), this_season or later; null for optional and turned-off tasks. |
tasks[].due_in_wordsstring or nullrequired | "Due in 5 days", "Overdue since Oct 3", "Open until Nov 15" or "Check"; null when off. |
open_issuesarray of objectsrequired | |
open_issues[].idstringrequired | A issue ID, such as iss_01JC0000000000000000000000. |
open_issues[].addressstring or nullrequired | The web route that opens it. |
open_issues[].titlestringrequired | What the problem is. |
open_issues[].severityone of: low, medium, high, urgentrequired | How bad it is: low (cosmetic or minor), medium (needs fixing), high (getting worse or costly), urgent (safety, water or no heat). |
open_issues[].statusone of: open, monitoring, resolvedrequired | open (needs work), monitoring (watching a symptom), resolved (fixed or no longer a problem). |
open_issues[].opened_onstringrequired | When it was noticed. |
visitsarray of objectsrequired | Visits about it, newest first, at most 20. |
visits[].idstringrequired | A visit ID, such as vst_01JC0000000000000000000000. |
visits[].addressstring or nullrequired | The web route that opens it. |
visits[].titlestringrequired | What it was for. |
visits[].statusone of: scheduled, done, cancelledrequired | Where the visit stands. |
visits[].contractor_namestring or nullrequired | Who came or is coming. |
visits[].starts_atstring (date-time) or nullrequired | When they are due, start of the window. |
visits[].visited_onstring or nullrequired | When the work happened, YYYY-MM-DD. |
visits[].summarystring or nullrequired | What was done. |
identificationsarray of objectsrequired | |
identifications[].idstringrequired | A identification ID, such as idn_01JC0000000000000000000000. |
identifications[].manufacturerstring or nullrequired | The maker read from the label. |
identifications[].model_numberstring or nullrequired | The model number as printed. |
identifications[].serialstring or nullrequired | The serial read. |
identifications[].category_keystring or nullrequired | The kind it looked like. |
identifications[].model_idstring or nullrequired | The model it linked the asset to. |
identifications[].linked_current_modelbooleanrequired | True when this reading linked the model the item has now, as opposed to one someone chose. |
identifications[].created_atstring (date-time)required | When the label was read. |
identifications[].alternativesarray of stringsrequired | Other model numbers it could be, likeliest first. |
identifications[].evidenceobject or nullrequired | The photo or source it read. |
identifications[].evidence.idstringrequired | A evidence ID, such as evi_01JC0000000000000000000000. |
identifications[].evidence.file_idstring or nullrequired | The photo, manual or invoice it was read from. |
identifications[].evidence.urlstring or nullrequired | The web page it was found on. |
identifications[].evidence.said_by_person_idstring or nullrequired | Who said it. |
identifications[].evidence.locatorstring or nullrequired | Where in the source, such as "p. 14". |
identifications[].evidence.excerptstring or nullrequired | The exact text the value was read from. |
serial_matchesarray of objectsrequired | Other items in service in the household with the same serial number, ignoring case, spaces and dashes. Empty when this item has no serial. |
serial_matches[].idstringrequired | A asset ID, such as ast_01JC0000000000000000000000. |
serial_matches[].namestringrequired | Its name. |
replaced_byarray of objectsrequired | What replaced it, then what replaced that, and so on. |
replaced_by[].idstringrequired | A asset ID, such as ast_01JC0000000000000000000000. |
replaced_by[].namestringrequired | Its name. |
replaced_by[].retired_onstring or nullrequired | No description. |
replacesarray of objectsrequired | What this one replaced, then what that replaced, and so on. |
replaces[].idstringrequired | A asset ID, such as ast_01JC0000000000000000000000. |
replaces[].namestringrequired | Its name. |
replaces[].retired_onstring or nullrequired | No description. |
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 | not_found | The household doesn't exist, or you aren't a member of it. |
Examples#
These are real. Each was recorded from a sample household, the Okafors, running through the whole API when this site was built.
Everything about one item
curl 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/queries/maintenance.asset.get?asset_id=ast_01M6V9CSVCMZFAP6ZN5WANZ6M8' \
-H "Cookie: rigel_session=$RIGEL_SESSION"const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/queries/maintenance.asset.get?asset_id=ast_01M6V9CSVCMZFAP6ZN5WANZ6M8", {
headers: {
Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
},
});
const data = await response.json();GET /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/queries/maintenance.asset.get?asset_id=ast_01M6V9CSVCMZFAP6ZN5WANZ6M8 HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CT085Q15GMG4WVC3HJFD
{
"id": "ast_01M6V9CSVCMZFAP6ZN5WANZ6M8",
"address": "/maintenance/assets/ast_01M6V9CSVCMZFAP6ZN5WANZ6M8",
"name": "Basement furnace",
"property_id": "prp_01M6V9CSTXS6P4CG6RNTNT60FA",
"property_name": "The Okafor house",
"location_id": "mlc_01M6V9CSTZEJ4XTJHRBQ1HGD2J",
"location_name": "Utility closet, Basement",
"category_id": "cat_01M6V9CSVCJFP27BZN7X5PGZ0B",
"category_key": "furnace",
"category_name": "Furnace",
"status": "identified",
"serial": "4116A04418",
"installed_on": "2016",
"installed_precision": "year",
"quantity": 1,
"notes": "The filter slot is on the right side, behind the blower door.",
"retired_on": null,
"model": {
"id": "eqm_01M6V9CSVCHRA5SDZNT6181WQM",
"manufacturer": "Hearthline",
"model_number": "FX96-080-1625",
"variant": null,
"label": "Hearthline FX96-080-1625"
},
"group": null,
"members": [],
"photos": [],
"specs": [
{
"attribute_id": "atr_01M6V9CSW7YVWP9VJJ42SFK57E",
"key": "afue",
"label": "Efficiency (AFUE)",
"value": null,
"value_num": 96,
"unit": "percent",
"in_words": "96%",
"origin": "label",
"origin_in_words": "From the label",
"evidence_id": null,
"source": "asset"
},
{
"attribute_id": "atr_01M6V9CSW8XX8EG50TW7K8DJT3",
"key": "filter_size",
"label": "Filter size",
"value": "16x25x1",
"value_num": null,
"unit": null,
"in_words": "16x25x1",
"origin": "homeowner",
"origin_in_words": "You told Rigel",
"evidence_id": null,
"source": "asset"
},
{
"attribute_id": "atr_01M6V9CSW5DANGBHC842K65T0A",
"key": "fuel",
"label": "Fuel",
"value": "natural gas",
"value_num": null,
"unit": null,
"in_words": "natural gas",
"origin": "label",
"origin_in_words": "From the label",
"evidence_id": "evi_01M6V9CSW5YT2FPEC8HZ9MMN6H",
"source": "asset"
}
],
"manuals": [],
"missing_specs": [
{
"key": "input_btu",
"label": "Input",
"unit": "btu_per_hour",
"note": "Not found yet"
},
{
"key": "output_btu",
"label": "Output",
"unit": "btu_per_hour",
"note": "Not found yet"
},
{
"key": "stages",
"label": "Stages",
"unit": null,
"note": "Not found yet"
},
{
"key": "airflow",
"label": "Airflow",
"unit": "cfm",
"note": "Not found yet"
},
{
"key": "width",
"label": "Cabinet width",
"unit": "in",
"note": "Not found yet"
},
{
"key": "voltage",
"label": "Voltage",
"unit": "v",
"note": "Not found yet"
}
],
"parts": [
{
"part_id": "prt_01M6V9CSWCCK3TQDA78RGRZ2E2",
"name": "Furnace filter 16x25x1 MERV 11",
"manufacturer": "Aerofresh",
"part_number": "AF-1625-M11",
"description": "The furnace takes one. They come in packs of four.",
"is_oem": false,
"purchase_url": null,
"product_id": "prd_01M6V9CSWCK03ABGA7BSJA03Q1",
"product_name": "Furnace filter 16x25x1",
"fits": "asset",
"evidence_id": null
}
],
"warranties": [],
"tasks": [
{
"id": "mtk_01M6V9CSWSHKH0MYE1RMRRDC58",
"address": "/maintenance/tasks/mtk_01M6V9CSWSHKH0MYE1RMRRDC58",
"title": "Annual furnace inspection",
"importance": "essential",
"status": "active",
"next_due_on": "2026-11-19",
"due_group": "due_soon",
"due_in_words": "Due in 12 days"
},
{
"id": "mtk_01M6V9CSWM1GKX8MAYQFYBAM3S",
"address": "/maintenance/tasks/mtk_01M6V9CSWM1GKX8MAYQFYBAM3S",
"title": "Replace the furnace filter",
"importance": "essential",
"status": "active",
"next_due_on": "2027-02-06",
"due_group": "later",
"due_in_words": "Due Feb 6, 2027"
}
],
"open_issues": [],
"visits": [
{
"id": "vst_01M6V9CSYWPZZCJP1Q0PBTS1SF",
"address": "/maintenance/visits/vst_01M6V9CSYWPZZCJP1Q0PBTS1SF",
"title": "Furnace inspection and tune-up",
"status": "scheduled",
"contractor_name": "Smith Heating & Air",
"starts_at": "2026-11-19T15:00:00.000Z",
"visited_on": null,
"summary": null
}
],
"identifications": [],
"serial_matches": [],
"replaced_by": [],
"replaces": []
}For Rigel#
Rigel's tool for this query is maintenance_asset_get. Rigel runs this on its own, then says what it did. The agent guide has the rest.