Submit a building design to Gage and get back a real, buildable cold-formed steel (CFS) framing quote from the Gage fabricator network.
Use this when you have generated or been given a floor plan or 3D house model and need to know what it costs to frame in steel, who would fabricate it, and how it breaks into panels.
Give it structured geometry (levels, walls as start/end points, openings, roof) plus the build site ZIP and project type. It reduces the model to the quoting engine's inputs, checks whether the design can actually be auto-panelized, and returns:
- a structural feasibility flag,
- an itemized quote (steel, transport, engineering, subtotal, confidence band, fabricator and lead time),
- a downloadable preliminary panelization package (panel count, panel footage and totals; the panel-by-panel schedule goes to the Gage fabricator that takes the job).
It refuses rather than guesses. Geometry that is invalid or outside what the engine prices comes back as a structured error; a design that is legible but needs a structural decision (curved walls, a header over 12 ft, a cantilevered storey, tall walls) comes back with status "needs_human_review" and no price. A quote is only ever returned for a design that passed every check.
Pricing, tonnage and fabricator routing are computed by Gage API v1, not by this tool. Panelization output is preliminary and unstamped; stamped shop drawings are issued by the assigned fabricator after a quote is accepted.
View input schema
{
"type": "object",
"properties": {
"design": {
"type": "object",
"properties": {
"geometry": {
"description": "Inline structured geometry. Preferred.",
"type": "object",
"properties": {
"units": {
"default": "ft",
"type": "string",
"enum": [
"ft",
"in",
"m",
"mm"
]
},
"levels": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"index": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Storey index, 0 = ground floor."
},
"floor_to_ceiling": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Floor-to-ceiling height, in geometry.units. API v1 accepts 7-14 ft."
},
"footprint_area": {
"description": "Enclosed floor area in geometry.units squared. Omit to have it traced from the closed exterior wall loop.",
"type": "number",
"exclusiveMinimum": 0
},
"walls": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "Caller-supplied wall id, echoed back in the panel schedule.",
"type": "string"
},
"start": {
"type": "array",
"items": [
{
"type": "number"
},
{
"type": "number"
}
],
"description": "Plan coordinate [x, y] in geometry.units, measured on the wall centreline."
},
"end": {
"type": "array",
"items": [
{
"type": "number"
},
{
"type": "number"
}
],
"description": "Plan coordinate [x, y] in geometry.units, measured on the wall centreline."
},
"height": {
"description": "Wall height, in geometry.units. Defaults to the level floor_to_ceiling.",
"type": "number",
"exclusiveMinimum": 0
},
"type": {
"default": "exterior",
"type": "string",
"enum": [
"exterior",
"interior"
]
},
"load_bearing": {
"description": "Defaults to true for exterior walls, false for interior.",
"type": "boolean"
},
"curved": {
"description": "Set true for any arc or non-straight run. Curved CFS walls are not auto-panelized and route to human engineering.",
"type": "boolean"
},
"openings": {
"default": [],
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "Caller-supplied id, echoed back in the panel schedule.",
"type": "string"
},
"type": {
"type": "string",
"enum": [
"window",
"door",
"garage_door",
"sliding_door",
"cased_opening"
],
"description": "Opening type. API v1 counts windows and doors; everything that is not a window is counted as a door because it still needs a header and full-height jambs."
},
"width": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Rough opening width, in geometry.units."
},
"height": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Rough opening height, in geometry.units."
},
"sill_height": {
"description": "Height from finished floor to the sill, in geometry.units.",
"type": "number",
"minimum": 0
},
"offset": {
"description": "Distance from the wall start point to the near jamb, in geometry.units. Supply it when you want panel seams checked against opening positions.",
"type": "number",
"minimum": 0
}
},
"required": [
"type",
"width",
"height"
]
}
}
},
"required": [
"start",
"end"
]
}
}
},
"required": [
"index",
"floor_to_ceiling",
"walls"
]
},
"description": "One entry per storey, ground floor first."
},
"roof": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"flat",
"shed",
"gable",
"hip",
"gambrel"
]
},
"pitch": {
"type": "string",
"pattern": "^\\d{1,2}:12$",
"description": "Rise over 12 run, e.g. \"6:12\". Use \"0:12\" for flat."
},
"overhang": {
"description": "Eave overhang, in geometry.units. Informational.",
"type": "number",
"minimum": 0
}
},
"required": [
"type",
"pitch"
],
"description": "Roof form drives a large share of the steel tonnage, so it is required rather than assumed."
}
},
"required": [
"levels",
"roof"
]
},
"model_ref": {
"description": "Reference to a hosted model file.",
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "HTTPS URL the server can fetch. Must be readable without credentials."
},
"format": {
"type": "string",
"enum": [
"geometry_json",
"ifc",
"ifcxml",
"glb",
"gltf",
"dxf",
"dwg",
"rvt",
"skp",
"pdf"
],
"description": "Only geometry_json (this schema, serialised) is machine-readable in v1. Other formats return unsupported_design_format."
},
"sha256": {
"description": "Optional integrity check on the fetched file.",
"type": "string",
"pattern": "^[0-9a-f]{64}$"
}
},
"required": [
"url",
"format"
]
}
}
},
"project": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 120
},
"type": {
"type": "string",
"enum": [
"residential",
"commercial",
"adu",
"garage"
],
"description": "garage prices as residential framing and is labelled a garage."
},
"jurisdiction": {
"type": "object",
"properties": {
"zip": {
"type": "string",
"pattern": "^\\d{5}$",
"description": "5-digit US ZIP of the build site. Drives fabricator routing and freight."
},
"city": {
"type": "string"
},
"state": {
"type": "string",
"minLength": 2,
"maxLength": 2
},
"code_cycle": {
"description": "Governing code, e.g. \"IRC 2021\" or \"IBC 2021\". Recorded on the submission and surfaced in the compliance block.",
"type": "string"
},
"ahj": {
"description": "Authority having jurisdiction, if known.",
"type": "string"
}
},
"required": [
"zip"
]
},
"load_zone": {
"description": "Site loads. Omitting these means the quote carries no snow/wind/seismic uplift and is flagged as such.",
"type": "object",
"properties": {
"snow_psf": {
"description": "Ground snow load. Above 50 psf the engine applies a tonnage multiplier.",
"type": "number",
"minimum": 0,
"maximum": 300
},
"wind_mph": {
"description": "Ultimate design wind speed. Above 130 mph the engine applies a multiplier.",
"type": "number",
"minimum": 0,
"maximum": 250
},
"seismic": {
"description": "Seismic design category. D and E apply a multiplier.",
"type": "string",
"enum": [
"A",
"B",
"C",
"D",
"E"
]
}
}
},
"gauge_spec": {
"description": "Steel gauge. Omit only if unknown: the quote then states 18ga as an explicit, disclosed assumption.",
"type": "string",
"enum": [
"25ga",
"20ga",
"18ga",
"16ga"
]
},
"square_footage_sqft": {
"description": "Declared total floor area. Cross-checked against the geometry; a large mismatch routes to human review.",
"type": "number",
"exclusiveMinimum": 0
},
"stories": {
"description": "Declared storey count. Cross-checked against the geometry.",
"type": "integer",
"minimum": 1,
"maximum": 8
},
"target_date": {
"description": "Desired delivery date. Informational, not priced.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"required": [
"type",
"jurisdiction"
]
},
"options": {
"type": "object",
"properties": {
"include_panelization": {
"default": true,
"description": "Generate the panel schedule package when the design is feasible.",
"type": "boolean"
},
"max_panel_length_ft": {
"description": "Longest shippable panel. Defaults to the server setting (12 ft).",
"type": "number",
"exclusiveMinimum": 0,
"maximum": 40
},
"stud_spacing_in": {
"description": "Stud spacing on centre. Defaults to 24 in, matching the engine tonnage model.",
"type": "number",
"exclusiveMinimum": 0,
"maximum": 48
}
}
}
},
"required": [
"design",
"project"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}