Keyless HVAC Data API

HVAC Design-Temp & Quick Load API

The outdoor design temperatures and quick load numbers HVAC contractors and estimators actually need — from a US address or ZIP, in one JSON call. No account, no key required to try it.

GET · JSON only CORS enabled Stateless / cacheable Keyless geocoding (US Census) Every response carries a confidence field

Base URL: https://fieldwork-hvac-ellington.netlify.app

What it returns

99% / 1%
Winter heating & summer cooling design dry-bulb (°F)
BTU/h
Quick heating & cooling load + tons + required CFM
50 states
+ DC, with finer metro overrides where climate diverges
Honest
Provenance + confidence on every result — never a silent wrong number

1  ·  Design Temperatures

GET /design-temp

Outdoor ASHRAE-family design conditions for a US location. Provide address or zip.

ParamTypeNotes
addressstringUS street address or "City, ST". Geocoded via the keyless US Census geocoder.
zipstring5-digit US ZIP. Higher precision than address when it hits a metro override.

Example

curl "https://fieldwork-hvac-ellington.netlify.app/design-temp?zip=20500"
{
  "location": {
    "resolvedPlace": "Washington DC, DC",
    "lat": 38.9, "lon": -77.04,
    "zip": "20500"
  },
  "elevationFt": 30,
  "design": {
    "heatingWinter99F": 17,
    "coolingSummer1F": 94,
    "coolingGrainsDifference": 34,
    "units": "°F dry-bulb",
    "definition": "Winter 99% heating / summer 1% cooling design dry-bulb temperatures."
  },
  "confidence": "state-representative",
  "method": "state headline station (DC)",
  "source": "built-in ASHRAE-family climate table",
  "disclaimer": "Representative ASHRAE-family design conditions ..."
}

By address

curl "https://fieldwork-hvac-ellington.netlify.app/design-temp?address=Denver,+CO"

2  ·  Quick Load

GET /quick-load

A quick, honest whole-house Manual-J-style block load from a handful of facts. Not a stamped room-by-room Manual J.

ParamTypeNotes
zip requiredstringUS ZIP — sets the outdoor design temps.
sqft requirednumberConditioned area, 200–25000.
yearnumberYear built → construction era (insulation, windows, tightness). Default era: 1990–2009.
stories1 | 2Default 1.
glazinglight | average | lotsGlass as a share of floor area. Default average.
ductsconditioned | attic | crawl | basementWhere the ducts run. Default attic.

Example

curl "https://fieldwork-hvac-ellington.netlify.app/quick-load?zip=20500&sqft=2400&year=1968&stories=2&ducts=attic"
{
  "load": {
    "heatingBtuh": 78000,
    "coolingBtuh": 51000,
    "coolingTons": 4.25,
    "nominalTons": 4.5,
    "requiredCoolingCFM": 1650
  },
  "designTemps": {
    "heatingWinter99F": 17,
    "coolingSummer1F": 94,
    "resolvedPlace": "Washington DC, DC",
    "confidence": "state-representative"
  },
  "assumptions": {
    "sqft": 2400, "stories": 2, "era": "Before 1970",
    "construction": "2x4_uninsulated, attic_r19, double_clear",
    "basis": "Simple block load from home size + era defaults. ..."
  },
  "basis": "Quick block-load estimate from home size + construction era. NOT a stamped room-by-room Manual J."
}

Illustrative values — exact numbers depend on the engine version.

Info / health

curl "https://fieldwork-hvac-ellington.netlify.app/health"

Data provenance & confidence

Every response says how the numbers were resolved. Design temps are representative ASHRAE-family conditions for a regional station — not the exact ASHRAE station for every ZIP. Read the confidence field:

confidencemeaning
zip-regionZIP fell in a finer metro override (e.g. Northern Virginia, Houston, Fresno) — most specific.
state-representativeState headline station (e.g. Denver for CO). Good state-level default; intra-state microclimate not resolved.
nearest-stationResolved from coordinates to the nearest representative station (address path with no ZIP).

For a permit-stamped Manual J, verify design temps against the ACCA/ASHRAE table for the specific station.

Errors

JSON, with a clear message. 400 = bad input (says what's wrong), 404 = address not geocodable, 422 = non-US / unresolvable location, 405 = non-GET.

{ "error": "bad_request", "message": "sqft out of range (200–25000).", "detail": { "sqft": 99 } }