Products
Federated catalog of construction-product SKUs across 10 categories with per-spec JSONB filtering
The products vertical is a federated factual catalog of construction SKUs sourced from federal certification registries and manufacturer catalogs. Specs are normalized into a JSONB column so each category keeps its native shape; a typed-cast filter envelope lets agents query the underlying paths safely.
Categories
| Slug | Source authorities | Status | SKUs |
|---|---|---|---|
hvac | ENERGY STAR (heat pumps + Geo + boilers + furnaces) | live | 6,206 |
electrical | ENERGY STAR (ceiling + ventilating fans) | live | 1,588 |
plumbing | EPA WaterSense JSON API (9 fixture types) | live | 2,547 |
windows | ENERGY STAR Storm + NFRC CPD top-10 mfrs | live | 42 |
insulation | ENERGY STAR Certified Insulation | live | 36 |
lumber | Weyerhaeuser TJI mfr PDFs (Tier-A regex) | live | 6 |
drywall | USG Sheetrock mfr PDFs (Tier-A regex) | live | 5 |
doors | NFRC CPD top-10 mfrs (shared cron with windows) | live | 5 |
roofing | CertainTeed Landmark mfr PDFs (Tier-A regex) | live | 4 |
hardware | Simpson Strong-Tie + ICC-ES T3 (DMCA-gated) | deferred (LLC) | — |
Counts as of 2026-05-28. Each category becomes "live" only when an ETL
has populated ≥1 SKU; an independent audit pass rate of ≥95% is the
target before promoting confidence from mfr_published to certified.
Call /v1/products/list for the live status + SKU counts so agents
don't waste calls asking for coming_soon categories.
Endpoints
GET /v1/products/list
GET /v1/products/categories/{category}?filter[specs.<field>.<op>]=<value>
GET /v1/products/{product_id}
GET /v1/products/search?q=<text>
GET /v1/products/compare?ids=<id1>,<id2>,...
GET /v1/products/sourcesAll endpoints require Authorization: Bearer <your-api-key> and count
against your monthly quota at the same rate as the other data verticals.
Typed-cast JSONB filter envelope
GET /v1/products/categories/hvac?filter[specs.seer2.gte]=16&filter[specs.refrigerant.eq]=R-454BSupported operators: gte, lte, gt, lt, eq. The filter parser
validates each field against a per-category allowlist; an unknown spec
key returns HTTP 400 with invalid_filter_key: specs.<key>.
Per-category spec keys are declared in
app/routes/v1/products/_filters.py.
For HVAC (live), the supported spec keys are:
specs.seer2(double) — SEER2 efficiency ratingspecs.eer2(double) — EER2 efficiency ratingspecs.hspf2(double) — HSPF2 heating efficiencyspecs.afue(double) — Annual Fuel Utilization Efficiencyspecs.btu_h_cooling(double) — Cooling capacity, BTU/hspecs.btu_h_heating(double) — Heating capacity, BTU/hspecs.voltage(double)specs.phases(double)
Confidence taxonomy
Each row carries one of four confidence values:
| Value | Meaning |
|---|---|
certified | Issued by a federal authority (ENERGY STAR, AHRI, NFRC, ICC-ES) |
mfr_published | Extracted deterministically from a manufacturer official PDF catalog |
ollama_extracted | Extracted via local Qwen 2.5-VL vision fallback (lower confidence; values are normalized but should be cross-checked) |
legacy_or_stale | Source was authoritative when fetched but is no longer the current edition |
Sources
GET /v1/products/sources enumerates the source-authority registry
with the legal tier (T0/T1/T2/T3) and per-source SKU count. See the
crawler page for the operational rules
(BuildCalcAPI-Crawler/1.0 UA, 1 req/sec throttle, unconditional
robots.txt honor, DMCA contact).
Methodology
A full methodology page lives at /docs/methodology/products (published
with sub-deliverable 12 close).