Current Methods
A common way to set performance target for new construction is to build an energy model using the Performance Rating Method in ASHRAE 90.1 Appendix G. The method compares the proposed design against a baseline model of the same building, with envelope performance and system efficiencies set to prescribed values from a specific version of the standard. Targets are typically expressed as a percentage improvement over that baseline (e.g., 50% better than ASHRAE 90.1-2004). This approach is widely used for energy code compliance and for green building certifications such as LEED.
Another approach is to use a reference model. The DOE commercial prototype building models, maintained by PNNL, cover sixteen building types: commercial buildings plus mid- and high-rise residential. Each is published for a set of representative climate locations and across multiple editions of ASHRAE 90.1. If you need a reasonable target for a medium office in climate zone 5A designed to ASHRAE 90.1-2016, the prototype's modeled energy use gives you a ready-made benchmark without building a model of your own.
A Middle Ground
On the one hand, energy code compliance models that use Appendix G provide clear performance targets, but there needs to be an actual design to model. This doesn’t always exist in the earliest stages of project development or when creating portfolio-level performance targets. In addition, this approach involves extensive modeling time, which might be fine for a single project but doesn’t scale to multiple sites.
On the other hand, the reference models are a faster, cheaper way to set targets, but they don’t take into consideration design or operational constraints. This might be fine for a generic office or multifamily building, but new construction projects typically have more complex programming and design requirements.
Carbon Signal falls somewhere between these two approaches. When you create a new building on Carbon Signal without any utility data, it generates an energy model that represents a general set of assumptions about the building based on it’s size, location, and building type. All of those assumptions are editable, so you can specify target performance values for different building components based on site-specific constraints. The model outputs (energy use, carbon emissions, utility costs) act as performance benchmarks. This approach offers more flexibility than a reference model, but greater speed and simplicity than a detailed compliance model. It’s a simple adaptation of Carbon Signal’s core strength - model calibration - that lends itself nicely to creating performance targets for new construction.
A Typical Building
You don’t have to have utility data to create a building on Carbon Signal. When you create a building without any utility data, the energy model is configured with default parameters based on the building’s size, type, and location. The defaults loosely correspond to a “typical” building, and are represented by a probability distribution of values.
To access these defaults with the API, ask for the presets before creating a building. The response gives you model_refinements, end_use_refinements, and COP targets for the heating and cooling systems.
import os
import requests
BASE_URL = "https://api.carbonsignal.com"
s = requests.Session()
s.headers["Authorization"] = f"Bearer{os.environ['CARBON_SIGNAL_API_KEY']}"
team_id = s.get(f"{BASE_URL}/v1.0/me").json()["settings"]["active_team_id"]
# All six keys are required. For a building with no utility history, both data
# keys are sent as explicit nulls -- omitting them is a validation error.
presets = s.post(f"{BASE_URL}/v1.0/presets/query", json={
"occupancy_type": "OFFICE",
"coordinates": {"lat": 42.3493, "lon": -71.0410},
"heating_system_type": "ELECTRICITY",
"cooling_system_type": "ELECTRICITY",
"measured_utilities": None,
"annual_eui": None,
}).json()Customizing the Target
The output of this “typical” building model - the energy use, carbon emissions, and utility costs - represents a benchmark, or target, for performance. You can adjust the target by changing the presets in model_refinements. If you have a building with high ventilation requirements, for example, you can increase the ventilation rates, and the model will adjust accordingly. Similarly, if you know the building needs to have a high-performance envelope, you can increase the wall and roof R-values (WALLR, ROOFR), window-to-wall ratio (WWR), glazing U-factor and SHGC (WINU, WINSHGC), and infiltration (INFIL) parameters. Most parameters carry a value and a confidence level. The confidence levels - LOW, MEDIUM, or HIGH- can be used strategically in different stages of target setting. A HIGH confidence setting might represent a strict project specification, while a MEDIUM or LOW confidence setting might represent something that is still under discussion.
config = s.get(f"{BASE_URL}/v1.0/config").json()
wallr = config["model_parameters"]["WALLR"]["model_refinement"]
assert wallr["type"] == "selection" # the other variant is "number_input"
# and exposes min/max instead of options
refinements = dict(presets["model_refinements"])
refinements["WALLR"] = {"value": wallr["options"][3]["value"], "confidence": "HIGH"}
Once you adjust the presets, then you can create the building, passing the refined parameters rather than the original values.
building = s.post(f"{BASE_URL}/v1.0/buildings", params={"team_id": team_id}, json={
"name": "Seaport Block D -- schematic design",
"area": 220_000, # ft2
"location": {"type": "coordinates", "lat": 42.3493,
"lon": -71.0410, "country": "US"},
"occupancy_type": "OFFICE",
"heating_system": {"type": "ELECTRICITY",
"cop_target": presets["heating_system_target"]},
"cooling_system": {"type": "ELECTRICITY",
"cop_target": presets["cooling_system_target"]},
"model_refinements": refinements,
"end_use_refinements": presets["end_use_refinements"],
"reported_energy": [], # no metered history
"calibration_year": None, # -> modeled baseline
"notes": None,
"secondary_occupancy_type": None,
"secondary_occupancy_percentage": None,
"discount_rate_percentage": 4.0,
"lease_end_date": 2045,
"constrain_analysis_to_lease_term": False,
}).json()
building["baseline_data"] # "MODELED"Reading the Benchmark
Poll the result endpoints directly. They return 200 with a message field until the results exist. Every distributional value in the API is the same five-key object: lower, p25, estimate, p75, upper. For a modeled building these describe the spread of the ensemble — the range of outcomes across plausible parameter values.
bid = building["id"]
baseline = s.get(f"{BASE_URL}/v1.0/buildings/{bid}/baseline").json()
if "message" in baseline: # "Baseline energy not ready."
... # back off and retry
# 12 monthly statistics per utility; every value in kBtu/ft2
annual_eui = sum(m["estimate"] for m in baseline["total"])
# Don't sum the monthly lower/upper into an annual band -- the twelve intervals
# are not independent, and adding them asserts a correlation the model doesn't
# claim. Compare month against month instead.
january = baseline["total"][0]
january["lower"], january["p25"], january["estimate"], january["p75"], january["upper"]
end_uses = s.get(f"{BASE_URL}/v1.0/buildings/{bid}/end-uses").json()
end_uses["energy"]["total"]["eui"]["heating"]["estimate"] # kBtu/ft2
end_uses["energy"]["electricity"]["percentage"]["lighting"]["estimate"] # 0-1
Having the full energy model for target setting gives you a lot of flexibility that a simple prototype model cannot. You can set targets for specific end uses - like heating, cooling, or lighting - or, with a little creativity, figure out which characteristics drive energy use and what range of values are acceptable.
Conclusion
While Carbon Signal was designed as a tool for existing building retrofits, it can easily be adapted to create benchmarks and help set targets for new construction. Once you understand how the building energy model is created and how it can be controlled through model refinement, it opens up new possibilities for analysis. Using the API is a perfect way to tap into this advanced level of functionality.




