Skip to content
Rigel docs
Open Rigel

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#

Everything about one item: parameters
FieldDescription
household_idpathstringrequired

The household's ID.

asset_idquerystringrequired

A asset ID, such as ast_01JC0000000000000000000000.

Response#

200 The answer.

Everything about one item: response fields
FieldDescription
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 inventory.product.have whether there's a spare.

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 nullrequiredNo 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 nullrequiredNo description.

Errors#

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

Everything about one item: errors
StatusCodeWhen
400validation_failedA field is missing, misspelled or out of range. details.fields lists each problem.
401unauthenticatedThe request has no valid session.
404not_foundThe 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

Request, curl
curl 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/queries/maintenance.asset.get?asset_id=ast_01M6V9CSVCMZFAP6ZN5WANZ6M8' \
  -H "Cookie: rigel_session=$RIGEL_SESSION"
Request, TypeScript
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();
Request, HTTP
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>
Response, 200
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.

Rigel is in early access, and sign-up is by invitation. Open Rigel