Construction quantities from cited calculators, takeoffs, a planner and house drawings. No prices.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Computes the result of one calculator, identified by its slug, from the input values given: the amount of material a job needs, such as the bags of concrete for a slab or the sheets of drywall for a room, counted in bags, sheets, studs, tiles, litres, gallons, cubic yards or m³. Returns it in metric and US units with the inputs used, sources, a citation and the page link. No prices.
The calculator's slug, such as concrete-calculator.
full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read.
The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes "12 ft", "3.5 m", "8' 3 1/2\"" or {"value": 12, "unit": "ft"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.
Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures.
The unit system inputs left out open in, and the one the page link opens in. The answer comes in both.
true adds the working: the inputs as the calculator received them, every intermediate figure its own compute reports with its unit, the range check and the unit restatement, ending on the same figures. The answer's figures are identical either way.
Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit.
Computes the result of one calculator, identified by its slug, from the input values given: the amount of material a job needs, such as the bags of concrete for a slab or the sheets of drywall for a room, counted in bags, sheets, studs, tiles, litres, gallons, cubic yards or m³. Returns it in metric and US units with the inputs used, sources, a citation and the page link. No prices.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The calculator's slug, such as concrete-calculator. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| inputs | object | The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes "12 ft", "3.5 m", "8' 3 1/2\"" or {"value": 12, "unit": "ft"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on. |
| market | string | Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| explain | boolean | true adds the working: the inputs as the calculator received them, every intermediate figure its own compute reports with its unit, the range check and the unit restatement, ending on the same figures. The answer's figures are identical either way. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "The calculator's slug, such as concrete-calculator."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"inputs": {
"type": "object",
"description": "The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.",
"maxProperties": 100,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"explain": {
"type": "boolean",
"default": false,
"description": "true adds the working: the inputs as the calculator received them, every intermediate figure its own compute reports with its unit, the range check and the unit restatement, ending on the same figures. The answer's figures are identical either way."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
}Runs up to 25 construction calculator calculations in one request, each a calculator slug or permanent id with its own input values, and returns each run's full answer in order (metric and US units, inputs used, sources, citation, page link) or that run's refusal; one refusal leaves the rest answered. No prices.
| Argument | Type | Description |
|---|---|---|
| items* | array | The runs, 1 to 25, each one calculator and its inputs; answered in the same order. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| market | string | The market for every run that does not name its own. |
| system | string | The unit system for every run that does not name its own. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
{
"type": "object",
"required": [
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug"
],
"properties": {
"ref": {
"type": "string",
"maxLength": 80,
"description": "The caller's own label for this run, returned with its result."
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "The calculator's slug or permanent id, such as concrete-calculator or cq-c0201."
},
"inputs": {
"type": "object",
"description": "The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.",
"maxProperties": 100,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
},
"maxItems": 25,
"minItems": 1,
"description": "The runs, 1 to 25, each one calculator and its inputs; answered in the same order."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "The market for every run that does not name its own."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system for every run that does not name its own."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
}Is a builder's quote right on quantities? Reads a contractor's quote (pasted text) against the reader's own job and returns each quoted quantity against the range the job's calculators give, the lines it leaves out or adds, and the questions to ask. Money is removed and not judged; a difference is a question, not a verdict.
| Argument | Type | Description |
|---|---|---|
| job* | string | The quote check: bathroom-quote, plastering-quote, or a takeoff's ({takeoff id}-quote). |
| quote* | string | The quote's text. Prices may be left in; they are taken out before reading. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| market | string | Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| selection | object | Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system. |
Groups a materials list, bill of materials, takeoff, plan or project (lines, calculator slugs or a project state token) by CSI MasterFormat 2018 division, by the site's own keyword rule over each line's calculator or words. A suggested grouping, not a specification; no Uniclass or NRM grouping is given. No prices.
| Argument | Type | Description |
|---|---|---|
| lines | array | Lines of a takeoff, plan, house, drawing or bill: each a label, and the calculator slug where known. |
| token | string | A project state token: its lines are grouped. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| calculators | array | Calculator slugs or permanent ids. |
{
"type": "object",
"required": [],
"properties": {
"lines": {
"type": "array",
"items": {
"type": "object",
"properties": {
"from": {
"type": "string",
"maxLength": 160,
"description": "Where the line came from, as a project file names it (calculator:…, takeoff:…)."
},
"slug": {
"type": "string",
"maxLength": 120,
"description": "The calculator that made the line, where known."
},
"unit": {
"type": "string",
"maxLength": 40
},
"label": {
"type": "string",
"maxLength": 200
},
"quantity": {
"type": "number"
},
"calculator": {
"type": "string",
"maxLength": 120
},
"description": {
"type": "string",
"maxLength": 200
}
},
"additionalProperties": true
},
"maxItems": 400,
"minItems": 1,
"description": "Lines of a takeoff, plan, house, drawing or bill: each a label, and the calculator slug where known."
},
"token": {
"type": "string",
"maxLength": 16384,
"minLength": 8,
"description": "A project state token: its lines are grouped."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"calculators": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 400,
"minItems": 1,
"description": "Calculator slugs or permanent ids."
}
},
"additionalProperties": false
}Converts one value from one unit to another, for example 2 m³ to cubic yards, with the exact factor the site's calculators apply, and returns the converted value and the factor.
| Argument | Type | Description |
|---|---|---|
| to* | string | |
| from* | string | |
| value* | number | |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| dimension | string | Only where a unit names more than one kind of quantity. |
{
"type": "object",
"required": [
"value",
"from",
"to"
],
"properties": {
"to": {
"type": "string",
"maxLength": 40
},
"from": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"dimension": {
"type": "string",
"maxLength": 40,
"description": "Only where a unit names more than one kind of quantity."
}
},
"additionalProperties": false
}Draws one plan on the Construction Canvas from the shapes, rooms laid out by adjacency on a grid, house figures, drawing commands, canvas document or template given, and returns its materials list, a plan of each level, labour hours, a link that opens the drawing on the canvas, and a file. It does not size structure.
| Argument | Type | Description |
|---|---|---|
| name | string | The project's name in the file. |
| house | object | The House Estimator's form: the house drawn as the estimator draws it. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| layout | object | Rooms by name, size and which room each stands against, laid out on a grid: shared walls drawn once as partitions, every snap or move reported, and each room checked to close. |
| shapes | array | Simple shapes the assistant has read from the reader's words — a room, a deck, a patio, a bed, a path, a fence of legs and turns — compiled into the canvas's own commands. Every length with its unit. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| variant |
Creates one My Project backup file from a list of calculator lines (each a calculator slug and its input values). Each line is computed as the site's page adds it; the reader restores the file on craftquantities.com as a new project. Nothing is stored or sent; no prices.
| Argument | Type | Description |
|---|---|---|
| name | string | The new project's name. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| market | string | Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| calculators* | array | The calculator lines: each a slug and its input values. |
{
"type": "object",
"required": [
"calculators"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"description": "The new project's name."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"calculators": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "The calculator's slug, such as concrete-calculator."
},
"label": {
"type": "string",
"maxLength": 120,
"description": "The line's name in the project; the calculator's title when left out."
},
"inputs": {
"type": "object",
"description": "The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.",
"maxProperties": 100,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
},
"maxItems": 50,
"minItems": 1,
"description": "The calculator lines: each a slug and its input values."
}
},
"additionalProperties": false
}Creates one My Project backup file from a Construction Canvas drawing: its lines, and the drawing itself, which the site's canvas reopens. The reader restores the file on craftquantities.com as a new project. Nothing is stored or sent; no prices.
| Argument | Type | Description |
|---|---|---|
| name | string | The new project's name. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| drawing* | object | The drawing: a house form, shapes, drawing commands or a canvas document. |
{
"type": "object",
"required": [
"drawing"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"description": "The new project's name."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"drawing": {
"type": "object",
"properties": {
"house": {
"type": "object",
"properties": {
"pitch": {
"enum": [
"4",
"6",
"8",
"10",
"12"
],
"type": "string",
"description": "Roof pitch, rise in 12."
},
"family": {
"enum": [
"wall.framed-exterior",
"wall.masonry",
"wall.sip"
],
"type": "string"
},
"values": {
"type": "object",
"description": "The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.",
"maxProperties": 30,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"example": {
"type": "string",
"maxLength": 120,
"description": "Start from one of the site's example houses (its slug) in place of the estimator's opening house."
},
"storeys": {
"enum": [
1,
2
],
"type": "integer"
},
"selection": {
"type": "object",
"description": "The exterior wall's build-up choices.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"roofFamily": {
"enum": [
"roof.asphalt-shingle",
"roof.tile-slate"
],
"type": "string"
},
"roofSelection": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
}
},
"description": "The House Estimator's form: the house drawn as the estimator draws it.",
"additionalProperties": false
},
"layout": {
"type": "object",
"required": [
"rooms"
],
"properties": {
"grid": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The grid every figure is snapped to (default 10 mm, or 1/2 in in US units). Each snap that changed a figure is reported."
},
"doors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"room": {
"type": "string",
"maxLength": 60,
"description": "The room it is in, by name."
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The side of that room."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The opening's width; left out, the canvas's default."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."
},
"between": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 2,
"minItems": 2,
"description": "A door only: the two rooms it joins, on the wall they share."
}
},
"additionalProperties": false
},
"maxItems": 60,
"description": "Each between two rooms, or in a room's side (an outside door where that side is an exterior wall)."
},
"rooms": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"width",
"depth"
],
"properties": {
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "Its south-west corner. The first room without at or against is at the origin.",
"additionalProperties": false
},
"name": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Unique in the layout; openings and later rooms refer to it."
},
"depth": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along y (north), wall centre to wall centre."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along x (east), wall centre to wall centre."
},
"against": {
"type": "object",
"required": [
"room",
"side"
],
"properties": {
"room": {
"type": "string",
"maxLength": 60
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"align": {
"enum": [
"start",
"centre",
"end"
],
"description": "Along that side: flush with its west or south end (start, the default), centred, or flush with the other end."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "Beside a side of an earlier room, sharing that wall.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"maxItems": 30,
"minItems": 1
},
"windows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"room": {
"type": "string",
"maxLength": 60,
"description": "The room it is in, by name."
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The side of that room."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The opening's width; left out, the canvas's default."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."
},
"between": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 2,
"minItems": 2,
"description": "A door only: the two rooms it joins, on the wall they share."
}
},
"additionalProperties": false
},
"maxItems": 60,
"description": "Each in a room's side, on an exterior wall."
}
},
"description": "Rooms by name, size and which room each stands against, laid out on a grid: shared walls drawn once as partitions, every snap or move reported, and each room checked to close.",
"additionalProperties": false
},
"shapes": {
"type": "array",
"items": {
"type": "object",
"required": [
"shape"
],
"properties": {
"p": {
"type": "object",
"description": "The component's own properties: a fence's heightMm, a bed's mulchDepthMm, each length with its unit.",
"maxProperties": 20
},
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "The south-west corner (a path's or a fence's start). Left out: the origin.",
"additionalProperties": false
},
"ref": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,40}$",
"description": "A name a later shape's against uses."
},
"legs": {
"type": "array",
"items": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"maxItems": 20,
"minItems": 1,
"description": "A fence's straight runs, in order."
},
"name": {
"type": "string",
"maxLength": 60,
"description": "A room's name."
},
"build": {
"enum": [
"pavers",
"concrete"
],
"description": "A patio's or path's build: a patio is concrete unless pavers; a path is pavers unless concrete."
},
"depth": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along y (north); for a deck or patio against a side, out from it."
},
"doors": {
"type": "array",
"items": {
"type": "object",
"required": [
"side",
"offset"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along the wall from its start: walls run counter-clockwise from the south-west corner."
},
"exterior": {
"type": "boolean",
"description": "A door: an outside door (the default) or an inside one."
}
},
"additionalProperties": false
},
"maxItems": 20
},
"gates": {
"type": "array",
"items": {
"type": "object",
"required": [
"leg",
"offset",
"width"
],
"properties": {
"leg": {
"type": "integer",
"minimum": 1
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "Gate openings, by leg (from 1) and offset along it; taken out of the run, the gate itself not counted."
},
"scope": {
"type": "object",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"shape": {
"enum": [
"room",
"deck",
"patio",
"bed",
"path",
"fence"
],
"description": "room: four exterior walls with doors and windows; deck, patio, bed (planted): a rectangle; path: a paved strip; fence: legs and 90° turns. Anything else is refused."
},
"turns": {
"type": "array",
"items": {
"enum": [
"left",
"right"
]
},
"maxItems": 19,
"description": "A 90° turn between each two legs."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along x (east): a room's, deck's, patio's or bed's; a path's width across it."
},
"length": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "A path's length."
},
"against": {
"type": "object",
"required": [
"shape",
"side"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"shape": {
"type": "string"
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A deck, patio or bed against a side of an earlier room or rectangle: centred on it, or from its west or south end by offset.",
"additionalProperties": false
},
"heading": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The way a path or a fence's first leg runs (default east)."
},
"windows": {
"type": "array",
"items": {
"type": "object",
"required": [
"side",
"offset"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along the wall from its start: walls run counter-clockwise from the south-west corner."
},
"exterior": {
"type": "boolean",
"description": "A door: an outside door (the default) or an inside one."
}
},
"additionalProperties": false
},
"maxItems": 20
},
"finishes": {
"type": "object",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
}
},
"additionalProperties": false
},
"maxItems": 40,
"minItems": 1,
"description": "Simple shapes the assistant has read from the reader's words — a room, a deck, a patio, a bed, a path, a fence of legs and turns — compiled into the canvas's own commands. Every length with its unit."
},
"variant": {
"type": "string",
"pattern": "^[a-z0-9-]{1,40}$",
"description": "With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list."
},
"commands": {
"type": "array",
"items": {
"type": "object",
"required": [
"op"
],
"properties": {
"c": {
"type": "string",
"maxLength": 40,
"description": "outline: slab, roof, floor, driveway, patio, deck, landscaping; path: footing, cable, pipe, duct, fence, retaining-wall; point: column, pier, outlet, switch, light, panel, fixture, drain, radiator, register."
},
"p": {
"type": "object",
"description": "The component's own properties by id (components/properties.ts): a length with its unit (widthMm, heightMm, sillMm …), a choice's option id, a count, true or false.",
"maxProperties": 20
},
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"op": {
"enum": [
"level",
"type",
"wall",
"opening",
"room",
"outline",
"path",
"point",
"beam",
"stair"
]
},
"to": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"ref": {
"type": "string",
"maxLength": 60,
"description": "A name by which later commands refer to what this one makes."
},
"from": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"kind": {
"enum": [
"door",
"window"
]
},
"name": {
"type": "string",
"maxLength": 60,
"description": "A level's, a type's or a room's name."
},
"type": {
"type": "string",
"maxLength": 60,
"description": "A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."
},
"wall": {
"type": "string",
"maxLength": 60,
"description": "The wall an opening goes in: its ref."
},
"level": {
"type": "string",
"maxLength": 60,
"description": "A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."
},
"scope": {
"type": "object",
"description": "Its scope question name → answer, by the planner's ids.",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"closed": {
"type": "boolean"
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "An opening's centre, measured along its wall from the wall's start."
},
"points": {
"type": "array",
"items": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"maxItems": 500,
"minItems": 2
},
"assembly": {
"type": "string",
"maxLength": 80,
"description": "A type's build-up: a canvas assembly id (wall.framed-exterior, roof.asphalt-shingle, slab.on-grade …)."
},
"finishes": {
"type": "object",
"description": "A room's, or a driveway's, patio's, deck's, fence's or retaining wall's surface role → finish id, by the planner's ids.",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"elevation": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"selection": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"thickness": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"wastePercent": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
},
"maxItems": 500,
"minItems": 1,
"description": "Drawing commands, in order, on the canvas's blank drawing (one storey; the wall, partition, window and door types). The whole request is at most 64 KiB."
},
"document": {
"type": "object",
"description": "A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener."
},
"template": {
"type": "string",
"pattern": "^[a-z0-9-]{1,60}$",
"description": "A Construction Canvas template's slug (the template index lists them: single-room, deck, two-car-garage …): the drawing its page shows, in the reader's system, with a link that opens it."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"description": "The drawing: a house form, shapes, drawing commands or a canvas document.",
"additionalProperties": false
}
},
"additionalProperties": false
}Creates one My Project backup file from a House Estimator form: the house's lines, and its drawing, which the site's canvas reopens. The reader restores the file on craftquantities.com as a new project. Nothing is stored or sent; no prices.
| Argument | Type | Description |
|---|---|---|
| name | string | The new project's name. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| houses* | array | The House Estimator form (one house; two give their lines without a drawing). |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
{
"type": "object",
"required": [
"houses"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"description": "The new project's name."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"houses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"pitch": {
"enum": [
"4",
"6",
"8",
"10",
"12"
],
"type": "string",
"description": "Roof pitch, rise in 12."
},
"family": {
"enum": [
"wall.framed-exterior",
"wall.masonry",
"wall.sip"
],
"type": "string"
},
"values": {
"type": "object",
"description": "The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.",
"maxProperties": 30,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"example": {
"type": "string",
"maxLength": 120,
"description": "Start from one of the site's example houses (its slug) in place of the estimator's opening house."
},
"storeys": {
"enum": [
1,
2
],
"type": "integer"
},
"selection": {
"type": "object",
"description": "The exterior wall's build-up choices.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
},
"roofFamily": {
"enum": [
"roof.asphalt-shingle",
"roof.tile-slate"
],
"type": "string"
},
"roofSelection": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
}
},
"additionalProperties": false
},
"maxItems": 2,
"minItems": 1,
"description": "The House Estimator form (one house; two give their lines without a drawing)."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
}
},
"additionalProperties": false
}Creates one My Project backup file from a room plan: one planned space, or several spaces and a roof. Its lines and its plan are saved as the site's planner saves them; the reader restores the file on craftquantities.com as a new project. Nothing is stored or sent; no prices.
| Argument | Type | Description |
|---|---|---|
| name | string | The new project's name. |
| plan* | object | One planned space, or a planned project of spaces and a roof. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
{
"type": "object",
"required": [
"plan"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"description": "The new project's name."
},
"plan": {
"type": "object",
"properties": {
"kind": {
"enum": [
"room",
"bathroom",
"slab",
"deck",
"driveway",
"fence",
"loft",
"retaining-wall",
"exterior-wall",
"stair"
],
"type": "string",
"description": "The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair."
},
"name": {
"type": "string",
"maxLength": 120
},
"roof": {
"type": "object",
"properties": {
"pitch": {
"type": "number",
"maximum": 24,
"minimum": 0,
"description": "The rise per 12 of run (6 = 6 in 12). Left out, each roof row says it waits for the pitch."
},
"scope": {
"type": "object",
"description": "Scope question name → answer value, by the planner's ids.",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"inputs": {
"type": "object",
"description": "Branch id → { calculator input id: value in its base unit }.",
"maxProperties": 50,
"additionalProperties": {
"type": "object",
"maxProperties": 30
}
},
"intent": {
"type": "string",
"maxLength": 40,
"description": "A trade, or everything."
},
"finishes": {
"type": "object",
"description": "Surface role → finish id, by the planner's ids.",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"leaveOut": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100,
"description": "Branch ids to leave out."
}
},
"additionalProperties": false
},
"doors": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"maximum": 20,
"minimum": 0
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"scope": {
"type": "object",
"description": "Scope question name → answer value, by the planner's ids.",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"inputs": {
"type": "object",
"description": "Branch id → { calculator input id: value in its base unit }.",
"maxProperties": 50,
"additionalProperties": {
"type": "object",
"maxProperties": 30
}
},
"intent": {
"type": "string",
"maxLength": 40,
"description": "A trade, or everything."
},
"spaces": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"figures"
],
"properties": {
"kind": {
"enum": [
"room",
"bathroom",
"slab",
"deck",
"driveway",
"fence",
"loft",
"retaining-wall",
"exterior-wall",
"stair"
],
"type": "string",
"description": "The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair."
},
"name": {
"type": "string",
"maxLength": 120
},
"doors": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"maximum": 20,
"minimum": 0
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"scope": {
"type": "object",
"description": "Scope question name → answer value, by the planner's ids.",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"inputs": {
"type": "object",
"description": "Branch id → { calculator input id: value in its base unit }.",
"maxProperties": 50,
"additionalProperties": {
"type": "object",
"maxProperties": 30
}
},
"intent": {
"type": "string",
"maxLength": 40,
"description": "A trade, or everything."
},
"figures": {
"type": "object",
"description": "The space's figures, by the planner's ids, each a length with its unit (a room: length, width, height, wallThickness; a fence: length, height; a stair: totalRise, width …).",
"maxProperties": 10,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"windows": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"maximum": 20,
"minimum": 0
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"finishes": {
"type": "object",
"description": "Surface role → finish id, by the planner's ids.",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"leaveOut": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100,
"description": "Branch ids to leave out."
}
},
"additionalProperties": false
},
"maxItems": 12,
"minItems": 1,
"description": "The spaces, in order, each one planned space."
},
"figures": {
"type": "object",
"description": "The space's figures, by the planner's ids, each a length with its unit (a room: length, width, height, wallThickness; a fence: length, height; a stair: totalRise, width …).",
"maxProperties": 10,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"windows": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"maximum": 20,
"minimum": 0
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"finishes": {
"type": "object",
"description": "Surface role → finish id, by the planner's ids.",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"leaveOut": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100,
"description": "Branch ids to leave out."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"description": "One planned space, or a planned project of spaces and a roof.",
"additionalProperties": false
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
}
},
"additionalProperties": false
}Creates one My Project backup file from a list of whole-job takeoffs (each a takeoff id and its measurements). Each takeoff's lines are worked as its page commits them; the reader restores the file on craftquantities.com as a new project. Nothing is stored or sent; no prices.
| Argument | Type | Description |
|---|---|---|
| name | string | The new project's name. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| market | string | Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| takeoffs* | array | The takeoffs: each an id and its measurements. |
{
"type": "object",
"required": [
"takeoffs"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"description": "The new project's name."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"takeoffs": {
"type": "array",
"items": {
"type": "object",
"required": [
"takeoff"
],
"properties": {
"takeoff": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$"
},
"leaveOut": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100,
"description": "Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour."
},
"selection": {
"type": "object",
"description": "Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"allowances": {
"type": "object",
"description": "Row → an allowance the reader sets: a percentage (cutting waste, overlap), or the option an allowance follows (a lay pattern). Row names are the takeoff's steps (the calculator slug, or the step key where one runs twice).",
"maxProperties": 50,
"additionalProperties": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "string",
"maxLength": 80
}
]
}
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
},
"measurements": {
"type": "object",
"description": "Measurement id → value, each length, area or volume with its unit (\"12 ft\", {\"value\": 3.6, \"unit\": \"m\"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure.",
"maxProperties": 50,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1,
"description": "The takeoffs: each an id and its measurements."
}
},
"additionalProperties": false
}Creates a request for quote from a materials list or bill of materials (the lines of a takeoff, house, plan or calculation, or the reader's own): Markdown to paste, a CSV, the site's link a merchant opens to price it, and a My Project file. It carries no price and sends nothing to anyone.
| Argument | Type | Description |
|---|---|---|
| note | string | A note to the merchants: delivery address area, dates, access. |
| items* | array | |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| market | string | Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures. |
| project | string | The project's name, as the merchants will see it. |
| currency | string | The currency prices are asked in; left out, the market's. |
{
"type": "object",
"required": [
"items"
],
"properties": {
"note": {
"type": "string",
"maxLength": 600,
"description": "A note to the merchants: delivery address area, dates, access."
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200
},
"unit": {
"type": "string",
"maxLength": 24
},
"label": {
"type": "string",
"maxLength": 200
},
"notes": {
"type": "string",
"maxLength": 200
},
"order": {
"type": "object",
"properties": {
"unit": {
"type": "string"
},
"quantity": {
"type": "number"
}
}
},
"packs": {
"type": "number",
"minimum": 0
},
"packName": {
"type": "string",
"maxLength": 120
},
"packSize": {
"type": "number",
"exclusiveMinimum": 0
},
"quantity": {
"type": "number",
"exclusiveMinimum": 0
},
"description": {
"type": "string",
"maxLength": 160
}
},
"description": "A bill line: as a takeoff, house, plan or calculation answer gives it (label or name, quantity, unit, and order where it says what to buy), or the reader's own."
},
"maxItems": 400,
"minItems": 1
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"project": {
"type": "string",
"maxLength": 120,
"description": "The project's name, as the merchants will see it."
},
"currency": {
"type": "string",
"maxLength": 8,
"description": "The currency prices are asked in; left out, the market's."
}
},
"additionalProperties": false
}Matches one building defect described in plain words, such as a crack, a damp patch, a water leak or a tripping breaker, to the site's diagnosis pages, and returns the candidate causes, what tells them apart, the checks in order and when to call a professional; ambiguous words return candidates. It does not say which cause it is.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many diagnoses at most. Left out: one when the match is clear, up to three when it is not. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| market | string | Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures. |
| symptom* | string | What the reader sees, hears or smells, in their own words: "my breaker keeps tripping when the kettle is on". |
{
"type": "object",
"required": [
"symptom"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 3,
"minimum": 1,
"description": "How many diagnoses at most. Left out: one when the match is clear, up to three when it is not."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"symptom": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "What the reader sees, hears or smells, in their own words: \"my breaker keeps tripping when the kettle is on\"."
}
},
"additionalProperties": false
}Estimates the materials to build one rectangular house of one or two storeys from a few figures (footprint, walls, roof, openings): every quantity with what to order, assumptions, plans of each storey and labour hours, as the site's House Estimator does. It counts; it does not design a structure. No prices.
| Argument | Type | Description |
|---|---|---|
| pitch | string | Roof pitch, rise in 12. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| family | string | |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| values | object | The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight ("12 m", "40 ft"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it. |
| example | string | Start from one of the site's example houses (its slug) in place of the estimator's opening house. |
| storeys | integer |
Exports a Construction Canvas drawing (a template, shapes, a room layout, drawing commands, house figures or a canvas document) as DXF for CAD, with the site's CQ-* layers, and as SVG, one plan per level in millimetres, or as one openBIM IFC4 model with quantity sets, as the canvas's own download writes them; a file too large to return is rebuilt from the drawing's link.
| Argument | Type | Description |
|---|---|---|
| house | object | The House Estimator's form: the house drawn as the estimator draws it. |
| level | string | One level by its id or name; left out, every level with something on its plan. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| layout | object | Rooms by name, size and which room each stands against, laid out on a grid: shared walls drawn once as partitions, every snap or move reported, and each room checked to close. |
| shapes | array | Simple shapes the assistant has read from the reader's words — a room, a deck, a patio, a bed, a path, a fence of legs and turns — compiled into the canvas's own commands. Every length with its unit. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
Returns the full text of one Craft Quantities page, identified by its id: what the page works out, its inputs or measurements with units and opening values, and its sources.
| Argument | Type | Description |
|---|---|---|
| id* | string | A page id, such as calculator:concrete-calculator, takeoff:concrete-slab or diagnosis:drain-gurgles. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"description": "A page id, such as calculator:concrete-calculator, takeoff:concrete-slab or diagnosis:drain-gurgles."
}
},
"additionalProperties": false
}Returns items of the Construction Quantities Benchmark, a CC BY 4.0 dataset of construction quantity questions built from the site's calculator test vectors: each with its inputs and a prompt in metric and US units, the expected answer in each system with its tolerance, and the worked steps. A page of calculators at a time or one calculator's items, with the download link and how to cite it.
| Argument | Type | Description |
|---|---|---|
| page | integer | Which page of the benchmark, from 1: each page holds the items of a few calculators, in slug order. 1 when left out. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| calculator | string | One calculator's items only, by its slug, such as concrete-calculator. |
{
"type": "object",
"required": [],
"properties": {
"page": {
"type": "integer",
"minimum": 1,
"description": "Which page of the benchmark, from 1: each page holds the items of a few calculators, in slug order. 1 when left out."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"calculator": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "One calculator's items only, by its slug, such as concrete-calculator."
}
},
"additionalProperties": false
}Returns the input fields of one calculator, identified by its slug: each field's id, label, accepted units, range and default value in metric and US units, with the calculator's version, page and citation. It computes nothing.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The calculator's slug, such as concrete-calculator. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "The calculator's slug, such as concrete-calculator."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
}
},
"additionalProperties": false
}Returns one worked construction estimate from the site, identified by its slug: the measurements, the steps in order with the calculator each uses, the figure each step pins and the waste chosen.
| Argument | Type | Description |
|---|---|---|
| slug* | string | A worked example's slug, such as bathroom-gutted-and-retiled. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "A worked example's slug, such as bathroom-gutted-and-retiled."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
}
},
"additionalProperties": false
}Returns the room planner's fields for one kind of space: its figures, surfaces and finish ids, scope questions and rows, with their ids.
| Argument | Type | Description |
|---|---|---|
| kind* | string | The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"room",
"bathroom",
"slab",
"deck",
"driveway",
"fence",
"loft",
"retaining-wall",
"exterior-wall",
"stair"
],
"type": "string",
"description": "The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
}
},
"additionalProperties": false
}Where does a figure come from, and how is it cited? Returns a calculator's sources as it cites them, the codes and standards they name, the site's standards pages, and a citation in plain, APA, Harvard and BibTeX. It adds no source the calculator does not cite.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The calculator's slug, such as concrete-calculator. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "The calculator's slug, such as concrete-calculator."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
}
},
"additionalProperties": false
}Returns the measurements one whole-job takeoff needs, identified by its id: each measurement's id, unit and opening figure, its build-up choices, the calculators it runs and what it leaves out.
| Argument | Type | Description |
|---|---|---|
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| takeoff* | string | A takeoff id, such as concrete-slab. |
{
"type": "object",
"required": [
"takeoff"
],
"properties": {
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"takeoff": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "A takeoff id, such as concrete-slab."
}
},
"additionalProperties": false
}Turns a supplier's or builder's quote the reader has, prices and all, into a My Project file, as the site's Quote to Estimate does, and checks its own arithmetic. The prices are the reader's figures from their document, not the site's.
| Argument | Type | Description |
|---|---|---|
| name | string | |
| quote* | string | The quote's text, one item to a line, with its prices. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| market | string | Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures. |
| currency | string | The quote's currency symbol, where the quote does not show it. |
| supplier | string |
{
"type": "object",
"required": [
"quote"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120
},
"quote": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "The quote's text, one item to a line, with its prices."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"currency": {
"type": "string",
"maxLength": 8,
"description": "The quote's currency symbol, where the quote does not show it."
},
"supplier": {
"type": "string",
"maxLength": 120
}
},
"additionalProperties": false
}Lays out reinforcing bars in a rectangular slab or footing from the bar size, spacing and cover the engineer gives: bars each way, bar lengths, total length with lap, stock sticks, weight where the site's calculator carries the size, and the layout as SVG and DXF. A quantity layout, not a design: it does not size structure or check a code.
| Argument | Type | Description |
|---|---|---|
| mats | any | One mat, or two (top and bottom) laid out alike. |
| cover* | any | The cover to the bars on plan, as the engineer gives it. |
| width* | any | Along y, with its unit. |
| chairs | object | Count the bar supports too, from the supplier's support spacing. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| length* | any | Along x, with its unit. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
Finds which family of building codes or standards governs one kind of work in one market (US, Canada, UK or Australia, or a country mapped to one), who publishes it and the site's standards page. It does not say which edition is in force: adoption is local, and the answer names who decides.
| Argument | Type | Description |
|---|---|---|
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| market* | string | US, CA, UK, AU or INTL — or a country's name ("England", "Canada"); a country the site has no market for answers as INTL. |
| subject | string | The work, in words: "kitchen wiring", "stair handrails", "gas boiler flue". |
| calculator | string | Or a calculator's slug: the subjects its own sources name. |
{
"type": "object",
"required": [
"market"
],
"properties": {
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"market": {
"type": "string",
"maxLength": 60,
"description": "US, CA, UK, AU or INTL — or a country's name (\"England\", \"Canada\"); a country the site has no market for answers as INTL."
},
"subject": {
"type": "string",
"maxLength": 200,
"description": "The work, in words: \"kitchen wiring\", \"stair handrails\", \"gas boiler flue\"."
},
"calculator": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "Or a calculator's slug: the subjects its own sources name."
}
},
"additionalProperties": false
}Measures areas, perimeters and lengths from points read off a floor plan, sketch or photo (pixel coordinates) and one known reference (a figured dimension, an ID-1 card or an A4 or Letter sheet): scaled figures in metric and US units with an uncertainty band, closure and crossing checks, and a canvas link. It receives no image.
| Argument | Type | Description |
|---|---|---|
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| shapes* | array | The outlines and lines read off the image, in its pixels. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| reference* | object | ONE known size in the same image: a figured dimension, or an object of known size by its four corners. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
| pixelError | number | How far any point may be off, in pixels: it sets the band. |
Returns a link that opens a construction calculator's page on craftquantities.com with the reader's figures filled in and their unit system, so a person can see or change the working on the page.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The calculator's slug, such as concrete-calculator. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| inputs | object | The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes "12 ft", "3.5 m", "8' 3 1/2\"" or {"value": 12, "unit": "ft"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on. |
| market | string | Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
Optimises a cut list: pieces of given lengths cut from the stock lengths a merchant sells (timber, studs, joists, rafters, rebar, trim), or rectangles nested on sheets (plasterboard, drywall, plywood, OSB, tiles) in straight edge-to-edge cuts. Gives the stock or sheets to buy, a cutting plan per bar or sheet, the real waste and a lower bound. Quantities only: no prices, no structural design.
| Argument | Type | Description |
|---|---|---|
| kerf | any | The saw's kerf, charged on every piece (both ways on a sheet). Left out, the material's: 3 mm or 1/8 in for a saw, none for a bar shear or a board knife. |
| kind* | any | linear: lengths cut from stock lengths (studs, plates, joists, rafters, bars, trim, boards). sheet: rectangles nested on sheets (plasterboard or drywall, plywood, OSB, tiles). |
| stock | array | linear: the stock lengths on offer, each in any number, with units ("4.8 m", "16 ft"). Left out, the market's usual lengths for the material in the system asked for. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| pieces* | array | The cut list: up to 200 lines and 3000 pieces (1500 for sheets) in all. |
| rotate | boolean | sheet: whether pieces may turn a quarter (no grain or strength axis to keep). Left out: yes for plasterboard and tiles, no for plywood and OSB. |
Builds a construction programme (build schedule, Gantt) from a project's labour hours: tasks by trade, stage and level in the usual order of work, each its hours over the crew and working day given, with totals, a CSV and, with a start date, an iCalendar file. Reads a project state token, a My Project file, takeoffs or a drawing. Weather, inspections and lead times are not modelled. No prices.
| Argument | Type | Description |
|---|---|---|
| crew | integer | People in each trade's crew, unless named in crews. |
| file | object | A My Project file (the backup a project-file answer returns, or one the reader exported): its active project's lines and any hours typed on them. |
| name | string | The project's name, for the files. |
| crews | object | People in a trade's crew, by trade id (carpentry, drywall, electrical, roofing …). |
| token | string | A project state token (cqp1.…) from a project-file answer or an update: the project whose lines are put in order. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| market | string | Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures. |
Plans several spaces together, with an optional roof over them, as one project in the site's room planner, and returns each space's rows, every line together, labour hours and the plan. Quantities only; it does not size structure.
| Argument | Type | Description |
|---|---|---|
| roof | object | |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| spaces* | array | The spaces, in order, each one planned space. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
{
"type": "object",
"required": [
"spaces"
],
"properties": {
"roof": {
"type": "object",
"properties": {
"pitch": {
"type": "number",
"maximum": 24,
"minimum": 0,
"description": "The rise per 12 of run (6 = 6 in 12). Left out, each roof row says it waits for the pitch."
},
"scope": {
"type": "object",
"description": "Scope question name → answer value, by the planner's ids.",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"inputs": {
"type": "object",
"description": "Branch id → { calculator input id: value in its base unit }.",
"maxProperties": 50,
"additionalProperties": {
"type": "object",
"maxProperties": 30
}
},
"intent": {
"type": "string",
"maxLength": 40,
"description": "A trade, or everything."
},
"finishes": {
"type": "object",
"description": "Surface role → finish id, by the planner's ids.",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"leaveOut": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100,
"description": "Branch ids to leave out."
}
},
"additionalProperties": false
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"spaces": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"figures"
],
"properties": {
"kind": {
"enum": [
"room",
"bathroom",
"slab",
"deck",
"driveway",
"fence",
"loft",
"retaining-wall",
"exterior-wall",
"stair"
],
"type": "string",
"description": "The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair."
},
"name": {
"type": "string",
"maxLength": 120
},
"doors": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"maximum": 20,
"minimum": 0
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"scope": {
"type": "object",
"description": "Scope question name → answer value, by the planner's ids.",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"inputs": {
"type": "object",
"description": "Branch id → { calculator input id: value in its base unit }.",
"maxProperties": 50,
"additionalProperties": {
"type": "object",
"maxProperties": 30
}
},
"intent": {
"type": "string",
"maxLength": 40,
"description": "A trade, or everything."
},
"figures": {
"type": "object",
"description": "The space's figures, by the planner's ids, each a length with its unit (a room: length, width, height, wallThickness; a fence: length, height; a stair: totalRise, width …).",
"maxProperties": 10,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"windows": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"maximum": 20,
"minimum": 0
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"finishes": {
"type": "object",
"description": "Surface role → finish id, by the planner's ids.",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"leaveOut": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100,
"description": "Branch ids to leave out."
}
},
"additionalProperties": false
},
"maxItems": 12,
"minItems": 1,
"description": "The spaces, in order, each one planned space."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
}Plans one space, such as a room or a bathroom, from its size, openings and the finishes chosen, as the site's room planner does, and returns its materials list: each row with its quantity, what it still needs, what is not built and why, and labour hours. Quantities only; it does not size structure.
| Argument | Type | Description |
|---|---|---|
| kind* | string | The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair. |
| name | string | |
| doors | object | |
| scope | object | Scope question name → answer value, by the planner's ids. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| inputs | object | Branch id → { calculator input id: value in its base unit }. |
| intent | string | A trade, or everything. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
Resolves a permanent Craft Quantities id (such as cq-c0412), a current or earlier slug, or a craftquantities.com address to the page as it is today: its kind, current slug, slug history, page link and permanent /id/ link. Ids are assigned once and kept when a page is renamed or moved; a removed page names its replacement.
| Argument | Type | Description |
|---|---|---|
| ref* | string | A permanent id (cq-c0412), a current or earlier slug, or a craftquantities.com address. |
| kind | any | Only pages of this kind. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
{
"type": "object",
"required": [
"ref"
],
"properties": {
"ref": {
"type": "string",
"maxLength": 300,
"minLength": 2,
"description": "A permanent id (cq-c0412), a current or earlier slug, or a craftquantities.com address."
},
"kind": {
"enum": [
"calculator",
"takeoff",
"guide",
"example",
"term",
"diagnosis"
],
"description": "Only pages of this kind."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
}
},
"additionalProperties": false
}Re-runs every pinned step of a worked construction estimate now, in both unit systems, and returns whether each still meets the published figure.
| Argument | Type | Description |
|---|---|---|
| slug* | string | A worked example's slug, such as bathroom-gutted-and-retiled. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "A worked example's slug, such as bathroom-gutted-and-retiled."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
}
},
"additionalProperties": false
}Works one whole-job takeoff, identified by its id, from the measurements given: the materials list of a job such as a slab or a deck, each line from its own calculator, with what to order, waste allowances, metric and US units, labour hours (not a price), what is not counted, a citation and the page link. It does not size structure.
| Argument | Type | Description |
|---|---|---|
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| market | string | Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| takeoff* | string | A takeoff id, such as concrete-slab. |
| leaveOut | array | Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour. |
| selection | object | Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system. |
| allowances |
Searches the site's construction pages for a question in everyday words, such as how much concrete or tile a job needs, and returns the matching pages: id, kind, title, link, description and slug. It finds; it computes nothing.
| Argument | Type | Description |
|---|---|---|
| kinds | array | Only these kinds of result; every kind when left out. |
| limit | integer | |
| query* | string | What to find, such as "concrete slab" or "skirting board". |
{
"type": "object",
"required": [
"query"
],
"properties": {
"kinds": {
"type": "array",
"items": {
"enum": [
"calculator",
"takeoff",
"example",
"diagnosis"
]
},
"minItems": 1,
"description": "Only these kinds of result; every kind when left out."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 25,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "What to find, such as \"concrete slab\" or \"skirting board\"."
}
},
"additionalProperties": false
}Works out how far one amount of material goes, such as 40 bags of concrete or 24 gallons of paint: the area it covers and the size of slab, room, deck or wall that is, as the site's Solve Backwards page works it, waste taken off. It does not size structure.
| Argument | Type | Description |
|---|---|---|
| have* | any | How much the reader has: a count for counted things (20, "20 sheets"); a measure with its unit for paint, concrete, soil ("24 gal", "2 m3", {"value": 90, "unit": "L"}). |
| page | string | A Solve Backwards page's slug, such as wall-paint, drywall-sheets, bricks, concrete-bags, ready-mix-concrete. |
| query | string | Or what the reader has, in words ("sheets of drywall", "bags of concrete"), when the slug is not known. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| system | string | The page's system; it sets the market's product (a 4 × 8 ft sheet in imperial). Left out: the unit's system, else metric. |
| settings | object | Optional: another calculator input, with its unit (a slab's thickness "4 in", coats 3). The inputs the page grows cannot be set. |
Says one building-trade word in US, Canadian, UK and Australian usage, such as plasterboard (drywall in the US) or skirting (baseboard): each market's word, how close each is, false-friend warnings, unit traps such as US and imperial gallons or short and metric tons with their conversions, and the market's document family. Brand names, plurals and misspellings match too.
| Argument | Type | Description |
|---|---|---|
| to | string | The market to say it in. |
| from | string | The market whose word it is, where known. |
| term* | string | A trade word or phrase as one market says it, a brand name said for the product, or a misspelling: "plasterboard", "gyprock", "casing", "skirting", "eavestrough", "a yard of concrete". |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
{
"type": "object",
"required": [
"term"
],
"properties": {
"to": {
"enum": [
"US",
"CA",
"UK",
"AU"
],
"type": "string",
"description": "The market to say it in."
},
"from": {
"enum": [
"US",
"CA",
"UK",
"AU"
],
"type": "string",
"description": "The market whose word it is, where known."
},
"term": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "A trade word or phrase as one market says it, a brand name said for the product, or a misspelling: \"plasterboard\", \"gyprock\", \"casing\", \"skirting\", \"eavestrough\", \"a yard of concrete\"."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
}
},
"additionalProperties": false
}Changes a My Project project carried in a state token (cqp1.…, from a project file answer): add or remove a room or space, change a dimension, add or remove a takeoff or calculator line, change a roof pitch, rename. Rebuilds every line and returns the new token, a short diff, the totals and a site link. The token is compressed, not encrypted; nothing is stored. No prices.
| Argument | Type | Description |
|---|---|---|
| file | boolean | true: the updated My Project file as well. |
| token* | string | A project state token from a project-file answer or an earlier update. |
| detail | string | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. |
| operations | array | The changes, applied in order (0 to 20); none returns the project as the token holds it. |
{
"type": "object",
"required": [
"token"
],
"properties": {
"file": {
"type": "boolean",
"default": false,
"description": "true: the updated My Project file as well."
},
"token": {
"type": "string",
"maxLength": 16384,
"minLength": 8,
"description": "A project state token from a project-file answer or an earlier update."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"operations": {
"type": "array",
"items": {
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"enum": [
"add_space",
"remove_space",
"set_dimension",
"add_takeoff",
"remove_takeoff",
"add_calculator",
"remove_calculator",
"set_roof_pitch",
"rename"
],
"description": "add_space (space) and remove_space (index) on a plan; set_dimension (target, index, field, value) on a space's figure, a calculator's input, a takeoff's measurement or a house's figure; add_takeoff (takeoff) and remove_takeoff (index or takeoff id); add_calculator (calculator) and remove_calculator (index); set_roof_pitch (pitch) on a plan's roof or a house; rename (name)."
},
"name": {
"type": "string",
"maxLength": 120
},
"field": {
"type": "string",
"maxLength": 60,
"description": "set_dimension: the figure's id (a space's figure, a calculator's input, a takeoff's measurement, a house's value)."
},
"index": {
"type": "integer",
"maximum": 49,
"minimum": 0,
"description": "Which space, calculator, takeoff or house, counting from 0 (default 0)."
},
"pitch": {
"anyOf": [
{
"type": "number",
"maximum": 24,
"minimum": 0
},
{
"type": "string",
"maxLength": 8
}
],
"description": "set_roof_pitch: rise in 12 (a plan's roof takes 0 to 24; a house 4, 6, 8, 10 or 12)."
},
"space": {
"type": "object",
"description": "add_space: one space as a plan takes it (kind, figures, doors, windows, finishes …)."
},
"value": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"target": {
"enum": [
"space",
"calculator",
"takeoff",
"house"
],
"description": "set_dimension: what the figure belongs to."
},
"takeoff": {
"anyOf": [
{
"type": "object",
"required": [
"takeoff"
],
"properties": {
"takeoff": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$"
},
"leaveOut": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100,
"description": "Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour."
},
"selection": {
"type": "object",
"description": "Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"allowances": {
"type": "object",
"description": "Row → an allowance the reader sets: a percentage (cutting waste, overlap), or the option an allowance follows (a lay pattern). Row names are the takeoff's steps (the calculator slug, or the step key where one runs twice).",
"maxProperties": 50,
"additionalProperties": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "string",
"maxLength": 80
}
]
}
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
},
"measurements": {
"type": "object",
"description": "Measurement id → value, each length, area or volume with its unit (\"12 ft\", {\"value\": 3.6, \"unit\": \"m\"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure.",
"maxProperties": 50,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
}
},
"additionalProperties": false
},
{
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$"
}
],
"description": "add_takeoff: a takeoff and its measurements; remove_takeoff: a takeoff id."
},
"calculator": {
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "The calculator's slug, such as concrete-calculator."
},
"label": {
"type": "string",
"maxLength": 120,
"description": "The line's name in the project; the calculator's title when left out."
},
"inputs": {
"type": "object",
"description": "The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.",
"maxProperties": 100,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "The changes, applied in order (0 to 20); none returns the project as the token holds it."
}
},
"additionalProperties": false
}| inputUnits |
| string |
| Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
| measurements | object | Measurement id → value, each length, area or volume with its unit ("12 ft", {"value": 3.6, "unit": "m"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure. |
{
"type": "object",
"required": [
"job",
"quote"
],
"properties": {
"job": {
"enum": [
"bathroom-quote",
"plastering-quote",
"room-fitout-quote",
"concrete-slab-quote",
"timber-deck-quote",
"stud-wall-quote",
"external-wall-quote",
"insulate-floor-quote",
"tile-floor-quote",
"retaining-wall-quote",
"plaster-room-quote",
"drywall-ceiling-quote",
"room-repaint-quote",
"wall-tile-quote",
"resilient-floor-quote",
"carpet-and-pad-quote",
"trim-run-quote",
"suspended-ceiling-quote",
"kitchen-refit-quote",
"garage-conversion-quote",
"basement-conversion-quote",
"staircase-replacement-quote",
"fitted-wardrobe-quote",
"party-wall-soundproofing-quote",
"damp-remediation-quote",
"floor-sanding-refinish-quote",
"bathroom-remodel-quote",
"shower-enclosure-quote",
"kitchen-splashback-quote",
"heated-bathroom-floor-quote",
"wet-room-tanking-quote",
"fiber-cement-siding-quote",
"asphalt-shingle-roof-quote",
"standing-seam-roof-quote",
"eaves-and-rainwater-quote",
"attic-insulation-quote",
"window-replacement-quote",
"framed-exterior-wall-quote",
"flat-roof-replacement-quote",
"loft-conversion-dormer-quote",
"pitched-roof-recovering-quote",
"new-external-opening-quote",
"external-wall-insulation-quote",
"rainscreen-cladding-quote",
"external-door-replacement-quote",
"exterior-repaint-quote",
"repointing-quote",
"cavity-wall-insulation-quote",
"sip-wall-quote",
"masonry-wall-quote",
"strip-footing-quote",
"concrete-driveway-quote",
"basement-wall-quote",
"service-connections-quote",
"paver-patio-quote",
"fence-run-quote",
"internal-wall-removal-quote",
"extension-shell-quote",
"chimney-breast-removal-quote",
"porch-addition-quote",
"garden-room-quote",
"electrical-rough-in-quote",
"panel-upgrade-quote",
"bathroom-ventilation-quote",
"radiant-floor-loop-quote",
"mini-split-install-quote",
"full-rewire-quote",
"central-heating-replacement-quote",
"air-source-heat-pump-quote",
"underfloor-heating-retrofit-quote",
"whole-house-ventilation-quote",
"solar-pv-battery-quote",
"ev-charger-installation-quote",
"landscape-bed-quote",
"irrigation-zone-quote",
"pool-surround-quote",
"garage-floor-coating-quote"
],
"type": "string",
"description": "The quote check: bathroom-quote, plastering-quote, or a takeoff's ({takeoff id}-quote)."
},
"quote": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "The quote's text. Prices may be left in; they are taken out before reading."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"selection": {
"type": "object",
"description": "Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
},
"measurements": {
"type": "object",
"description": "Measurement id → value, each length, area or volume with its unit (\"12 ft\", {\"value\": 3.6, \"unit\": \"m\"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure.",
"maxProperties": 50,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
}
},
"additionalProperties": false
}| string |
| With template: one of its two "what changes if" variants, by id; a wrong one is refused with the template's own list. |
| commands | array | Drawing commands, in order, on the canvas's blank drawing (one storey; the wall, partition, window and door types). The whole request is at most 64 KiB. |
| document | object | A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener. |
| template | string | A Construction Canvas template's slug (the template index lists them: single-room, deck, two-car-garage …): the drawing its page shows, in the reader's system, with a link that opens it. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
{
"type": "object",
"required": [],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"description": "The project's name in the file."
},
"house": {
"type": "object",
"properties": {
"pitch": {
"enum": [
"4",
"6",
"8",
"10",
"12"
],
"type": "string",
"description": "Roof pitch, rise in 12."
},
"family": {
"enum": [
"wall.framed-exterior",
"wall.masonry",
"wall.sip"
],
"type": "string"
},
"values": {
"type": "object",
"description": "The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.",
"maxProperties": 30,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"example": {
"type": "string",
"maxLength": 120,
"description": "Start from one of the site's example houses (its slug) in place of the estimator's opening house."
},
"storeys": {
"enum": [
1,
2
],
"type": "integer"
},
"selection": {
"type": "object",
"description": "The exterior wall's build-up choices.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"roofFamily": {
"enum": [
"roof.asphalt-shingle",
"roof.tile-slate"
],
"type": "string"
},
"roofSelection": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
}
},
"description": "The House Estimator's form: the house drawn as the estimator draws it.",
"additionalProperties": false
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"layout": {
"type": "object",
"required": [
"rooms"
],
"properties": {
"grid": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The grid every figure is snapped to (default 10 mm, or 1/2 in in US units). Each snap that changed a figure is reported."
},
"doors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"room": {
"type": "string",
"maxLength": 60,
"description": "The room it is in, by name."
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The side of that room."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The opening's width; left out, the canvas's default."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."
},
"between": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 2,
"minItems": 2,
"description": "A door only: the two rooms it joins, on the wall they share."
}
},
"additionalProperties": false
},
"maxItems": 60,
"description": "Each between two rooms, or in a room's side (an outside door where that side is an exterior wall)."
},
"rooms": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"width",
"depth"
],
"properties": {
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "Its south-west corner. The first room without at or against is at the origin.",
"additionalProperties": false
},
"name": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Unique in the layout; openings and later rooms refer to it."
},
"depth": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along y (north), wall centre to wall centre."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along x (east), wall centre to wall centre."
},
"against": {
"type": "object",
"required": [
"room",
"side"
],
"properties": {
"room": {
"type": "string",
"maxLength": 60
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"align": {
"enum": [
"start",
"centre",
"end"
],
"description": "Along that side: flush with its west or south end (start, the default), centred, or flush with the other end."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "Beside a side of an earlier room, sharing that wall.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"maxItems": 30,
"minItems": 1
},
"windows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"room": {
"type": "string",
"maxLength": 60,
"description": "The room it is in, by name."
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The side of that room."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The opening's width; left out, the canvas's default."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."
},
"between": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 2,
"minItems": 2,
"description": "A door only: the two rooms it joins, on the wall they share."
}
},
"additionalProperties": false
},
"maxItems": 60,
"description": "Each in a room's side, on an exterior wall."
}
},
"description": "Rooms by name, size and which room each stands against, laid out on a grid: shared walls drawn once as partitions, every snap or move reported, and each room checked to close.",
"additionalProperties": false
},
"shapes": {
"type": "array",
"items": {
"type": "object",
"required": [
"shape"
],
"properties": {
"p": {
"type": "object",
"description": "The component's own properties: a fence's heightMm, a bed's mulchDepthMm, each length with its unit.",
"maxProperties": 20
},
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "The south-west corner (a path's or a fence's start). Left out: the origin.",
"additionalProperties": false
},
"ref": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,40}$",
"description": "A name a later shape's against uses."
},
"legs": {
"type": "array",
"items": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"maxItems": 20,
"minItems": 1,
"description": "A fence's straight runs, in order."
},
"name": {
"type": "string",
"maxLength": 60,
"description": "A room's name."
},
"build": {
"enum": [
"pavers",
"concrete"
],
"description": "A patio's or path's build: a patio is concrete unless pavers; a path is pavers unless concrete."
},
"depth": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along y (north); for a deck or patio against a side, out from it."
},
"doors": {
"type": "array",
"items": {
"type": "object",
"required": [
"side",
"offset"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along the wall from its start: walls run counter-clockwise from the south-west corner."
},
"exterior": {
"type": "boolean",
"description": "A door: an outside door (the default) or an inside one."
}
},
"additionalProperties": false
},
"maxItems": 20
},
"gates": {
"type": "array",
"items": {
"type": "object",
"required": [
"leg",
"offset",
"width"
],
"properties": {
"leg": {
"type": "integer",
"minimum": 1
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "Gate openings, by leg (from 1) and offset along it; taken out of the run, the gate itself not counted."
},
"scope": {
"type": "object",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"shape": {
"enum": [
"room",
"deck",
"patio",
"bed",
"path",
"fence"
],
"description": "room: four exterior walls with doors and windows; deck, patio, bed (planted): a rectangle; path: a paved strip; fence: legs and 90° turns. Anything else is refused."
},
"turns": {
"type": "array",
"items": {
"enum": [
"left",
"right"
]
},
"maxItems": 19,
"description": "A 90° turn between each two legs."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along x (east): a room's, deck's, patio's or bed's; a path's width across it."
},
"length": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "A path's length."
},
"against": {
"type": "object",
"required": [
"shape",
"side"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"shape": {
"type": "string"
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A deck, patio or bed against a side of an earlier room or rectangle: centred on it, or from its west or south end by offset.",
"additionalProperties": false
},
"heading": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The way a path or a fence's first leg runs (default east)."
},
"windows": {
"type": "array",
"items": {
"type": "object",
"required": [
"side",
"offset"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along the wall from its start: walls run counter-clockwise from the south-west corner."
},
"exterior": {
"type": "boolean",
"description": "A door: an outside door (the default) or an inside one."
}
},
"additionalProperties": false
},
"maxItems": 20
},
"finishes": {
"type": "object",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
}
},
"additionalProperties": false
},
"maxItems": 40,
"minItems": 1,
"description": "Simple shapes the assistant has read from the reader's words — a room, a deck, a patio, a bed, a path, a fence of legs and turns — compiled into the canvas's own commands. Every length with its unit."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"variant": {
"type": "string",
"pattern": "^[a-z0-9-]{1,40}$",
"description": "With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list."
},
"commands": {
"type": "array",
"items": {
"type": "object",
"required": [
"op"
],
"properties": {
"c": {
"type": "string",
"maxLength": 40,
"description": "outline: slab, roof, floor, driveway, patio, deck, landscaping; path: footing, cable, pipe, duct, fence, retaining-wall; point: column, pier, outlet, switch, light, panel, fixture, drain, radiator, register."
},
"p": {
"type": "object",
"description": "The component's own properties by id (components/properties.ts): a length with its unit (widthMm, heightMm, sillMm …), a choice's option id, a count, true or false.",
"maxProperties": 20
},
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"op": {
"enum": [
"level",
"type",
"wall",
"opening",
"room",
"outline",
"path",
"point",
"beam",
"stair"
]
},
"to": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"ref": {
"type": "string",
"maxLength": 60,
"description": "A name by which later commands refer to what this one makes."
},
"from": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"kind": {
"enum": [
"door",
"window"
]
},
"name": {
"type": "string",
"maxLength": 60,
"description": "A level's, a type's or a room's name."
},
"type": {
"type": "string",
"maxLength": 60,
"description": "A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."
},
"wall": {
"type": "string",
"maxLength": 60,
"description": "The wall an opening goes in: its ref."
},
"level": {
"type": "string",
"maxLength": 60,
"description": "A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."
},
"scope": {
"type": "object",
"description": "Its scope question name → answer, by the planner's ids.",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"closed": {
"type": "boolean"
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "An opening's centre, measured along its wall from the wall's start."
},
"points": {
"type": "array",
"items": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"maxItems": 500,
"minItems": 2
},
"assembly": {
"type": "string",
"maxLength": 80,
"description": "A type's build-up: a canvas assembly id (wall.framed-exterior, roof.asphalt-shingle, slab.on-grade …)."
},
"finishes": {
"type": "object",
"description": "A room's, or a driveway's, patio's, deck's, fence's or retaining wall's surface role → finish id, by the planner's ids.",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"elevation": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"selection": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"thickness": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"wastePercent": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
},
"maxItems": 500,
"minItems": 1,
"description": "Drawing commands, in order, on the canvas's blank drawing (one storey; the wall, partition, window and door types). The whole request is at most 64 KiB."
},
"document": {
"type": "object",
"description": "A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener."
},
"template": {
"type": "string",
"pattern": "^[a-z0-9-]{1,60}$",
"description": "A Construction Canvas template's slug (the template index lists them: single-room, deck, two-car-garage …): the drawing its page shows, in the reader's system, with a link that opens it."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
}| selection | object | The exterior wall's build-up choices. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
| roofFamily | string |
| roofSelection | object |
{
"type": "object",
"required": [],
"properties": {
"pitch": {
"enum": [
"4",
"6",
"8",
"10",
"12"
],
"type": "string",
"description": "Roof pitch, rise in 12."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"family": {
"enum": [
"wall.framed-exterior",
"wall.masonry",
"wall.sip"
],
"type": "string"
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"values": {
"type": "object",
"description": "The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.",
"maxProperties": 30,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"example": {
"type": "string",
"maxLength": 120,
"description": "Start from one of the site's example houses (its slug) in place of the estimator's opening house."
},
"storeys": {
"enum": [
1,
2
],
"type": "integer"
},
"selection": {
"type": "object",
"description": "The exterior wall's build-up choices.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
},
"roofFamily": {
"enum": [
"roof.asphalt-shingle",
"roof.tile-slate"
],
"type": "string"
},
"roofSelection": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
}
},
"additionalProperties": false
}| formats | array | dxf, svg, ifc (openBIM IFC4: one file for the whole drawing, every level, with quantity sets), or several; left out, dxf and svg. |
| variant | string | With template: one of its two "what changes if" variants, by id; a wrong one is refused with the template's own list. |
| commands | array | Drawing commands, in order, on the canvas's blank drawing (one storey; the wall, partition, window and door types). The whole request is at most 64 KiB. |
| document | object | A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener. |
| template | string | A Construction Canvas template's slug (the template index lists them: single-room, deck, two-car-garage …): the drawing its page shows, in the reader's system, with a link that opens it. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
{
"type": "object",
"required": [],
"properties": {
"house": {
"type": "object",
"properties": {
"pitch": {
"enum": [
"4",
"6",
"8",
"10",
"12"
],
"type": "string",
"description": "Roof pitch, rise in 12."
},
"family": {
"enum": [
"wall.framed-exterior",
"wall.masonry",
"wall.sip"
],
"type": "string"
},
"values": {
"type": "object",
"description": "The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.",
"maxProperties": 30,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"example": {
"type": "string",
"maxLength": 120,
"description": "Start from one of the site's example houses (its slug) in place of the estimator's opening house."
},
"storeys": {
"enum": [
1,
2
],
"type": "integer"
},
"selection": {
"type": "object",
"description": "The exterior wall's build-up choices.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"roofFamily": {
"enum": [
"roof.asphalt-shingle",
"roof.tile-slate"
],
"type": "string"
},
"roofSelection": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
}
},
"description": "The House Estimator's form: the house drawn as the estimator draws it.",
"additionalProperties": false
},
"level": {
"type": "string",
"maxLength": 60,
"description": "One level by its id or name; left out, every level with something on its plan."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"layout": {
"type": "object",
"required": [
"rooms"
],
"properties": {
"grid": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The grid every figure is snapped to (default 10 mm, or 1/2 in in US units). Each snap that changed a figure is reported."
},
"doors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"room": {
"type": "string",
"maxLength": 60,
"description": "The room it is in, by name."
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The side of that room."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The opening's width; left out, the canvas's default."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."
},
"between": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 2,
"minItems": 2,
"description": "A door only: the two rooms it joins, on the wall they share."
}
},
"additionalProperties": false
},
"maxItems": 60,
"description": "Each between two rooms, or in a room's side (an outside door where that side is an exterior wall)."
},
"rooms": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"width",
"depth"
],
"properties": {
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "Its south-west corner. The first room without at or against is at the origin.",
"additionalProperties": false
},
"name": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Unique in the layout; openings and later rooms refer to it."
},
"depth": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along y (north), wall centre to wall centre."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along x (east), wall centre to wall centre."
},
"against": {
"type": "object",
"required": [
"room",
"side"
],
"properties": {
"room": {
"type": "string",
"maxLength": 60
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"align": {
"enum": [
"start",
"centre",
"end"
],
"description": "Along that side: flush with its west or south end (start, the default), centred, or flush with the other end."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "Beside a side of an earlier room, sharing that wall.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"maxItems": 30,
"minItems": 1
},
"windows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"room": {
"type": "string",
"maxLength": 60,
"description": "The room it is in, by name."
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The side of that room."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The opening's width; left out, the canvas's default."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."
},
"between": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 2,
"minItems": 2,
"description": "A door only: the two rooms it joins, on the wall they share."
}
},
"additionalProperties": false
},
"maxItems": 60,
"description": "Each in a room's side, on an exterior wall."
}
},
"description": "Rooms by name, size and which room each stands against, laid out on a grid: shared walls drawn once as partitions, every snap or move reported, and each room checked to close.",
"additionalProperties": false
},
"shapes": {
"type": "array",
"items": {
"type": "object",
"required": [
"shape"
],
"properties": {
"p": {
"type": "object",
"description": "The component's own properties: a fence's heightMm, a bed's mulchDepthMm, each length with its unit.",
"maxProperties": 20
},
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "The south-west corner (a path's or a fence's start). Left out: the origin.",
"additionalProperties": false
},
"ref": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,40}$",
"description": "A name a later shape's against uses."
},
"legs": {
"type": "array",
"items": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"maxItems": 20,
"minItems": 1,
"description": "A fence's straight runs, in order."
},
"name": {
"type": "string",
"maxLength": 60,
"description": "A room's name."
},
"build": {
"enum": [
"pavers",
"concrete"
],
"description": "A patio's or path's build: a patio is concrete unless pavers; a path is pavers unless concrete."
},
"depth": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along y (north); for a deck or patio against a side, out from it."
},
"doors": {
"type": "array",
"items": {
"type": "object",
"required": [
"side",
"offset"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along the wall from its start: walls run counter-clockwise from the south-west corner."
},
"exterior": {
"type": "boolean",
"description": "A door: an outside door (the default) or an inside one."
}
},
"additionalProperties": false
},
"maxItems": 20
},
"gates": {
"type": "array",
"items": {
"type": "object",
"required": [
"leg",
"offset",
"width"
],
"properties": {
"leg": {
"type": "integer",
"minimum": 1
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "Gate openings, by leg (from 1) and offset along it; taken out of the run, the gate itself not counted."
},
"scope": {
"type": "object",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"shape": {
"enum": [
"room",
"deck",
"patio",
"bed",
"path",
"fence"
],
"description": "room: four exterior walls with doors and windows; deck, patio, bed (planted): a rectangle; path: a paved strip; fence: legs and 90° turns. Anything else is refused."
},
"turns": {
"type": "array",
"items": {
"enum": [
"left",
"right"
]
},
"maxItems": 19,
"description": "A 90° turn between each two legs."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along x (east): a room's, deck's, patio's or bed's; a path's width across it."
},
"length": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "A path's length."
},
"against": {
"type": "object",
"required": [
"shape",
"side"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"shape": {
"type": "string"
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A deck, patio or bed against a side of an earlier room or rectangle: centred on it, or from its west or south end by offset.",
"additionalProperties": false
},
"heading": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The way a path or a fence's first leg runs (default east)."
},
"windows": {
"type": "array",
"items": {
"type": "object",
"required": [
"side",
"offset"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along the wall from its start: walls run counter-clockwise from the south-west corner."
},
"exterior": {
"type": "boolean",
"description": "A door: an outside door (the default) or an inside one."
}
},
"additionalProperties": false
},
"maxItems": 20
},
"finishes": {
"type": "object",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
}
},
"additionalProperties": false
},
"maxItems": 40,
"minItems": 1,
"description": "Simple shapes the assistant has read from the reader's words — a room, a deck, a patio, a bed, a path, a fence of legs and turns — compiled into the canvas's own commands. Every length with its unit."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"formats": {
"type": "array",
"items": {
"enum": [
"dxf",
"svg",
"ifc"
]
},
"maxItems": 3,
"minItems": 1,
"description": "dxf, svg, ifc (openBIM IFC4: one file for the whole drawing, every level, with quantity sets), or several; left out, dxf and svg."
},
"variant": {
"type": "string",
"pattern": "^[a-z0-9-]{1,40}$",
"description": "With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list."
},
"commands": {
"type": "array",
"items": {
"type": "object",
"required": [
"op"
],
"properties": {
"c": {
"type": "string",
"maxLength": 40,
"description": "outline: slab, roof, floor, driveway, patio, deck, landscaping; path: footing, cable, pipe, duct, fence, retaining-wall; point: column, pier, outlet, switch, light, panel, fixture, drain, radiator, register."
},
"p": {
"type": "object",
"description": "The component's own properties by id (components/properties.ts): a length with its unit (widthMm, heightMm, sillMm …), a choice's option id, a count, true or false.",
"maxProperties": 20
},
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"op": {
"enum": [
"level",
"type",
"wall",
"opening",
"room",
"outline",
"path",
"point",
"beam",
"stair"
]
},
"to": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"ref": {
"type": "string",
"maxLength": 60,
"description": "A name by which later commands refer to what this one makes."
},
"from": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"kind": {
"enum": [
"door",
"window"
]
},
"name": {
"type": "string",
"maxLength": 60,
"description": "A level's, a type's or a room's name."
},
"type": {
"type": "string",
"maxLength": 60,
"description": "A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."
},
"wall": {
"type": "string",
"maxLength": 60,
"description": "The wall an opening goes in: its ref."
},
"level": {
"type": "string",
"maxLength": 60,
"description": "A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."
},
"scope": {
"type": "object",
"description": "Its scope question name → answer, by the planner's ids.",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"closed": {
"type": "boolean"
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "An opening's centre, measured along its wall from the wall's start."
},
"points": {
"type": "array",
"items": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"maxItems": 500,
"minItems": 2
},
"assembly": {
"type": "string",
"maxLength": 80,
"description": "A type's build-up: a canvas assembly id (wall.framed-exterior, roof.asphalt-shingle, slab.on-grade …)."
},
"finishes": {
"type": "object",
"description": "A room's, or a driveway's, patio's, deck's, fence's or retaining wall's surface role → finish id, by the planner's ids.",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"elevation": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"selection": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"thickness": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"wastePercent": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
},
"maxItems": 500,
"minItems": 1,
"description": "Drawing commands, in order, on the canvas's blank drawing (one storey; the wall, partition, window and door types). The whole request is at most 64 KiB."
},
"document": {
"type": "object",
"description": "A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener."
},
"template": {
"type": "string",
"pattern": "^[a-z0-9-]{1,60}$",
"description": "A Construction Canvas template's slug (the template index lists them: single-room, deck, two-car-garage …): the drawing its page shows, in the reader's system, with a link that opens it."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
}| barSize* |
| string |
| As the engineer gives it: #4, 15M, N12, H12, T12 or 12 mm. |
| element | any | A slab, or a pad or strip footing, as a rectangle on plan. |
| formats | array | The drawing's files: svg, dxf or both (the default). |
| spacing | any | The spacing both ways, as the engineer gives it. |
| widthwise | object | The bars running along the width (spaced along the length): a spacing of their own, or a count. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
| lapPercent | number | The lap-splice allowance on the total; left out, the Rebar Calculator's own default. |
| lengthwise | object | The bars running along the length (spaced across the width): a spacing of their own, or a count. |
{
"type": "object",
"required": [
"length",
"width",
"cover",
"barSize"
],
"properties": {
"mats": {
"enum": [
1,
2
],
"default": 1,
"description": "One mat, or two (top and bottom) laid out alike."
},
"cover": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The cover to the bars on plan, as the engineer gives it."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along y, with its unit."
},
"chairs": {
"type": "object",
"required": [
"supportSpacing"
],
"properties": {
"supportSpacing": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The bar-support supplier's rated spacing."
},
"supportEveryNth": {
"enum": [
"1",
"2",
"3"
]
}
},
"description": "Count the bar supports too, from the supplier's support spacing.",
"additionalProperties": false
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"length": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along x, with its unit."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"barSize": {
"type": "string",
"maxLength": 12,
"minLength": 2,
"description": "As the engineer gives it: #4, 15M, N12, H12, T12 or 12 mm."
},
"element": {
"enum": [
"slab",
"footing"
],
"default": "slab",
"description": "A slab, or a pad or strip footing, as a rectangle on plan."
},
"formats": {
"type": "array",
"items": {
"enum": [
"svg",
"dxf"
]
},
"maxItems": 2,
"minItems": 1,
"description": "The drawing's files: svg, dxf or both (the default)."
},
"spacing": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The spacing both ways, as the engineer gives it."
},
"widthwise": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "A number of bars spread evenly from cover to cover; 0 leaves this direction out."
},
"spacing": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "The bars running along the width (spaced along the length): a spacing of their own, or a count.",
"additionalProperties": false
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
},
"lapPercent": {
"type": "number",
"maximum": 40,
"minimum": 0,
"description": "The lap-splice allowance on the total; left out, the Rebar Calculator's own default."
},
"lengthwise": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "A number of bars spread evenly from cover to cover; 0 leaves this direction out."
},
"spacing": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "The bars running along the length (spaced across the width): a spacing of their own, or a count.",
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"shapes",
"reference"
],
"properties": {
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"shapes": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"points"
],
"properties": {
"as": {
"enum": [
"measure",
"room",
"slab",
"floor",
"patio",
"deck",
"driveway",
"landscaping",
"roof",
"fence",
"footing",
"retaining-wall"
],
"description": "What it is drawn as on the canvas: a kept measure (the default), or a room (walls round it), slab, floor, patio, deck, driveway, landscaping or roof outline; a fence, footing or retaining wall path. A component is listed with its materials."
},
"kind": {
"enum": [
"area",
"length"
],
"description": "area: a closed outline (a floor, a slab, a roof plane on plan); length: a line or a path (a fence, a footing, a run)."
},
"name": {
"type": "string",
"maxLength": 60
},
"closed": {
"type": "boolean",
"description": "A length only: the path closes back to its first point."
},
"points": {
"type": "array",
"items": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
}
},
"description": "A point in the image's own pixels: x to the right, y down from the top-left corner.",
"additionalProperties": false
},
"maxItems": 501,
"minItems": 2,
"description": "In order round the outline or along the path."
},
"calculator": {
"type": "object",
"required": [
"slug",
"input"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 120
},
"input": {
"type": "string",
"maxLength": 80,
"description": "The id of the calculator's input that takes the figure."
},
"figure": {
"enum": [
"area",
"perimeter",
"length"
]
},
"inputs": {
"type": "object",
"description": "The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.",
"maxProperties": 100,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
}
},
"description": "A calculator the figure goes into, run on the figure and on both ends of its band (at most 10 per request).",
"additionalProperties": false
}
},
"additionalProperties": false
},
"maxItems": 40,
"minItems": 1,
"description": "The outlines and lines read off the image, in its pixels."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"reference": {
"type": "object",
"properties": {
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"object": {
"enum": [
"card",
"a4",
"letter",
"custom"
],
"description": "card: ISO/IEC 7810 ID-1 (85.60 × 53.98 mm); a4: 210 × 297 mm; letter: 8.5 × 11 in; custom: width and height given."
},
"corners": {
"type": "array",
"items": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
}
},
"description": "A point in the image's own pixels: x to the right, y down from the top-left corner.",
"additionalProperties": false
},
"maxItems": 4,
"minItems": 4,
"description": "Top-left, top-right, bottom-right, bottom-left; the width runs from the first to the second."
},
"dimension": {
"type": "object",
"required": [
"from",
"to",
"length"
],
"properties": {
"to": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
}
},
"description": "A point in the image's own pixels: x to the right, y down from the top-left corner.",
"additionalProperties": false
},
"from": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
}
},
"description": "A point in the image's own pixels: x to the right, y down from the top-left corner.",
"additionalProperties": false
},
"length": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"tolerance": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "How far the figure itself may be off (a dimension rounded to the nearest 10 mm: 5 mm)."
}
},
"additionalProperties": false
}
},
"description": "ONE known size in the same image: a figured dimension, or an object of known size by its four corners.",
"additionalProperties": false
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
},
"pixelError": {
"type": "number",
"default": 2,
"maximum": 50,
"minimum": 0.1,
"description": "How far any point may be off, in pixels: it sets the band."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "The calculator's slug, such as concrete-calculator."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"inputs": {
"type": "object",
"description": "The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.",
"maxProperties": 100,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
}| sheets | array | sheet: the sheet sizes on offer (the plan takes the one that buys the least area). Left out, the market's usual size for the material. |
| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| material | any | What is cut, for the market's stock lengths or sheet sizes, saw kerf and grain when they are left out: timber (the default for linear), rebar or casing; plasterboard (the default for sheet), plywood, OSB or tile. |
| minOffcut | any | linear: the shortest offcut worth keeping; shorter ones count as waste. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
{
"type": "object",
"required": [
"kind",
"pieces"
],
"properties": {
"kerf": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The saw's kerf, charged on every piece (both ways on a sheet). Left out, the material's: 3 mm or 1/8 in for a saw, none for a bar shear or a board knife."
},
"kind": {
"enum": [
"linear",
"sheet"
],
"description": "linear: lengths cut from stock lengths (studs, plates, joists, rafters, bars, trim, boards). sheet: rectangles nested on sheets (plasterboard or drywall, plywood, OSB, tiles)."
},
"stock": {
"type": "array",
"items": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"maxItems": 12,
"minItems": 1,
"description": "linear: the stock lengths on offer, each in any number, with units (\"4.8 m\", \"16 ft\"). Left out, the market's usual lengths for the material in the system asked for."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"pieces": {
"type": "array",
"items": {
"type": "object",
"required": [
"count"
],
"properties": {
"join": {
"type": "boolean",
"description": "linear: a run that may be joined where a stock length runs out (a plate, a rim, trim, a board run). Left out, a piece longer than every stock length is listed, not split: a joint in a joist, a rafter or a bar is the designer's."
},
"count": {
"type": "integer",
"maximum": 3000,
"minimum": 1
},
"label": {
"type": "string",
"maxLength": 60
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "sheet: the piece's width, with its unit."
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "sheet: the piece's height (along the grain), with its unit."
},
"length": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "linear: the finished length, with its unit."
},
"rotate": {
"type": "boolean",
"description": "sheet: whether this piece may turn a quarter; left out, as the request says."
}
},
"additionalProperties": false
},
"maxItems": 200,
"minItems": 1,
"description": "The cut list: up to 200 lines and 3000 pieces (1500 for sheets) in all."
},
"rotate": {
"type": "boolean",
"description": "sheet: whether pieces may turn a quarter (no grain or strength axis to keep). Left out: yes for plasterboard and tiles, no for plywood and OSB."
},
"sheets": {
"type": "array",
"items": {
"type": "object",
"required": [
"width",
"height"
],
"properties": {
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"maxItems": 6,
"minItems": 1,
"description": "sheet: the sheet sizes on offer (the plan takes the one that buys the least area). Left out, the market's usual size for the material."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"material": {
"enum": [
"timber",
"rebar",
"casing",
"plasterboard",
"plywood",
"osb",
"tile"
],
"description": "What is cut, for the market's stock lengths or sheet sizes, saw kerf and grain when they are left out: timber (the default for linear), rebar or casing; plasterboard (the default for sheet), plywood, OSB or tile."
},
"minOffcut": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "linear: the shortest offcut worth keeping; shorter ones count as waste."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
}| system | string | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. |
| daysOff | array | Dates not worked (holidays, a shutdown), YYYY-MM-DD. |
| drawing | object | A Construction Canvas drawing (a template, a house form, shapes, drawing commands or a canvas document), as a project file takes it; its levels set the level-by-level order. |
| takeoffs | array | Whole-job takeoffs, each an id and its measurements, as a project file takes them. |
| workDays | array | The days of the week worked, 1 Monday to 7 Sunday. |
| startDate | string | Optional first day (YYYY-MM-DD): the working days are then given dates and a calendar file is returned. No date is assumed without it. |
| hoursPerDay | number | Working hours in a crew's day. |
{
"type": "object",
"required": [],
"properties": {
"crew": {
"type": "integer",
"default": 2,
"maximum": 50,
"minimum": 1,
"description": "People in each trade's crew, unless named in crews."
},
"file": {
"type": "object",
"description": "A My Project file (the backup a project-file answer returns, or one the reader exported): its active project's lines and any hours typed on them."
},
"name": {
"type": "string",
"maxLength": 120,
"description": "The project's name, for the files."
},
"crews": {
"type": "object",
"description": "People in a trade's crew, by trade id (carpentry, drywall, electrical, roofing …).",
"additionalProperties": {
"type": "integer",
"maximum": 50,
"minimum": 1
}
},
"token": {
"type": "string",
"maxLength": 16384,
"minLength": 8,
"description": "A project state token (cqp1.…) from a project-file answer or an update: the project whose lines are put in order."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"daysOff": {
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"maxItems": 400,
"description": "Dates not worked (holidays, a shutdown), YYYY-MM-DD."
},
"drawing": {
"type": "object",
"properties": {
"house": {
"type": "object",
"properties": {
"pitch": {
"enum": [
"4",
"6",
"8",
"10",
"12"
],
"type": "string",
"description": "Roof pitch, rise in 12."
},
"family": {
"enum": [
"wall.framed-exterior",
"wall.masonry",
"wall.sip"
],
"type": "string"
},
"values": {
"type": "object",
"description": "The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.",
"maxProperties": 30,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"example": {
"type": "string",
"maxLength": 120,
"description": "Start from one of the site's example houses (its slug) in place of the estimator's opening house."
},
"storeys": {
"enum": [
1,
2
],
"type": "integer"
},
"selection": {
"type": "object",
"description": "The exterior wall's build-up choices.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"roofFamily": {
"enum": [
"roof.asphalt-shingle",
"roof.tile-slate"
],
"type": "string"
},
"roofSelection": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
}
},
"description": "The House Estimator's form: the house drawn as the estimator draws it.",
"additionalProperties": false
},
"layout": {
"type": "object",
"required": [
"rooms"
],
"properties": {
"grid": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The grid every figure is snapped to (default 10 mm, or 1/2 in in US units). Each snap that changed a figure is reported."
},
"doors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"room": {
"type": "string",
"maxLength": 60,
"description": "The room it is in, by name."
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The side of that room."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The opening's width; left out, the canvas's default."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."
},
"between": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 2,
"minItems": 2,
"description": "A door only: the two rooms it joins, on the wall they share."
}
},
"additionalProperties": false
},
"maxItems": 60,
"description": "Each between two rooms, or in a room's side (an outside door where that side is an exterior wall)."
},
"rooms": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"width",
"depth"
],
"properties": {
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "Its south-west corner. The first room without at or against is at the origin.",
"additionalProperties": false
},
"name": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Unique in the layout; openings and later rooms refer to it."
},
"depth": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along y (north), wall centre to wall centre."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along x (east), wall centre to wall centre."
},
"against": {
"type": "object",
"required": [
"room",
"side"
],
"properties": {
"room": {
"type": "string",
"maxLength": 60
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"align": {
"enum": [
"start",
"centre",
"end"
],
"description": "Along that side: flush with its west or south end (start, the default), centred, or flush with the other end."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "Beside a side of an earlier room, sharing that wall.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"maxItems": 30,
"minItems": 1
},
"windows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"room": {
"type": "string",
"maxLength": 60,
"description": "The room it is in, by name."
},
"side": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The side of that room."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "The opening's width; left out, the canvas's default."
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."
},
"between": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 2,
"minItems": 2,
"description": "A door only: the two rooms it joins, on the wall they share."
}
},
"additionalProperties": false
},
"maxItems": 60,
"description": "Each in a room's side, on an exterior wall."
}
},
"description": "Rooms by name, size and which room each stands against, laid out on a grid: shared walls drawn once as partitions, every snap or move reported, and each room checked to close.",
"additionalProperties": false
},
"shapes": {
"type": "array",
"items": {
"type": "object",
"required": [
"shape"
],
"properties": {
"p": {
"type": "object",
"description": "The component's own properties: a fence's heightMm, a bed's mulchDepthMm, each length with its unit.",
"maxProperties": 20
},
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "The south-west corner (a path's or a fence's start). Left out: the origin.",
"additionalProperties": false
},
"ref": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,40}$",
"description": "A name a later shape's against uses."
},
"legs": {
"type": "array",
"items": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"maxItems": 20,
"minItems": 1,
"description": "A fence's straight runs, in order."
},
"name": {
"type": "string",
"maxLength": 60,
"description": "A room's name."
},
"build": {
"enum": [
"pavers",
"concrete"
],
"description": "A patio's or path's build: a patio is concrete unless pavers; a path is pavers unless concrete."
},
"depth": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along y (north); for a deck or patio against a side, out from it."
},
"doors": {
"type": "array",
"items": {
"type": "object",
"required": [
"side",
"offset"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along the wall from its start: walls run counter-clockwise from the south-west corner."
},
"exterior": {
"type": "boolean",
"description": "A door: an outside door (the default) or an inside one."
}
},
"additionalProperties": false
},
"maxItems": 20
},
"gates": {
"type": "array",
"items": {
"type": "object",
"required": [
"leg",
"offset",
"width"
],
"properties": {
"leg": {
"type": "integer",
"minimum": 1
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "Gate openings, by leg (from 1) and offset along it; taken out of the run, the gate itself not counted."
},
"scope": {
"type": "object",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"shape": {
"enum": [
"room",
"deck",
"patio",
"bed",
"path",
"fence"
],
"description": "room: four exterior walls with doors and windows; deck, patio, bed (planted): a rectangle; path: a paved strip; fence: legs and 90° turns. Anything else is refused."
},
"turns": {
"type": "array",
"items": {
"enum": [
"left",
"right"
]
},
"maxItems": 19,
"description": "A 90° turn between each two legs."
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along x (east): a room's, deck's, patio's or bed's; a path's width across it."
},
"length": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "A path's length."
},
"against": {
"type": "object",
"required": [
"shape",
"side"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"shape": {
"type": "string"
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A deck, patio or bed against a side of an earlier room or rectangle: centred on it, or from its west or south end by offset.",
"additionalProperties": false
},
"heading": {
"enum": [
"south",
"east",
"north",
"west"
],
"description": "The way a path or a fence's first leg runs (default east)."
},
"windows": {
"type": "array",
"items": {
"type": "object",
"required": [
"side",
"offset"
],
"properties": {
"side": {
"enum": [
"south",
"east",
"north",
"west"
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Along the wall from its start: walls run counter-clockwise from the south-west corner."
},
"exterior": {
"type": "boolean",
"description": "A door: an outside door (the default) or an inside one."
}
},
"additionalProperties": false
},
"maxItems": 20
},
"finishes": {
"type": "object",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
}
},
"additionalProperties": false
},
"maxItems": 40,
"minItems": 1,
"description": "Simple shapes the assistant has read from the reader's words — a room, a deck, a patio, a bed, a path, a fence of legs and turns — compiled into the canvas's own commands. Every length with its unit."
},
"variant": {
"type": "string",
"pattern": "^[a-z0-9-]{1,40}$",
"description": "With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list."
},
"commands": {
"type": "array",
"items": {
"type": "object",
"required": [
"op"
],
"properties": {
"c": {
"type": "string",
"maxLength": 40,
"description": "outline: slab, roof, floor, driveway, patio, deck, landscaping; path: footing, cable, pipe, duct, fence, retaining-wall; point: column, pier, outlet, switch, light, panel, fixture, drain, radiator, register."
},
"p": {
"type": "object",
"description": "The component's own properties by id (components/properties.ts): a length with its unit (widthMm, heightMm, sillMm …), a choice's option id, a count, true or false.",
"maxProperties": 20
},
"at": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"op": {
"enum": [
"level",
"type",
"wall",
"opening",
"room",
"outline",
"path",
"point",
"beam",
"stair"
]
},
"to": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"ref": {
"type": "string",
"maxLength": 60,
"description": "A name by which later commands refer to what this one makes."
},
"from": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"kind": {
"enum": [
"door",
"window"
]
},
"name": {
"type": "string",
"maxLength": 60,
"description": "A level's, a type's or a room's name."
},
"type": {
"type": "string",
"maxLength": 60,
"description": "A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."
},
"wall": {
"type": "string",
"maxLength": 60,
"description": "The wall an opening goes in: its ref."
},
"level": {
"type": "string",
"maxLength": 60,
"description": "A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."
},
"scope": {
"type": "object",
"description": "Its scope question name → answer, by the planner's ids.",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"closed": {
"type": "boolean"
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"offset": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "An opening's centre, measured along its wall from the wall's start."
},
"points": {
"type": "array",
"items": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"y": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"description": "A point on plan, each coordinate a length with its unit.",
"additionalProperties": false
},
"maxItems": 500,
"minItems": 2
},
"assembly": {
"type": "string",
"maxLength": 80,
"description": "A type's build-up: a canvas assembly id (wall.framed-exterior, roof.asphalt-shingle, slab.on-grade …)."
},
"finishes": {
"type": "object",
"description": "A room's, or a driveway's, patio's, deck's, fence's or retaining wall's surface role → finish id, by the planner's ids.",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"elevation": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"selection": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"thickness": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"wastePercent": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
},
"maxItems": 500,
"minItems": 1,
"description": "Drawing commands, in order, on the canvas's blank drawing (one storey; the wall, partition, window and door types). The whole request is at most 64 KiB."
},
"document": {
"type": "object",
"description": "A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener."
},
"template": {
"type": "string",
"pattern": "^[a-z0-9-]{1,60}$",
"description": "A Construction Canvas template's slug (the template index lists them: single-room, deck, two-car-garage …): the drawing its page shows, in the reader's system, with a link that opens it."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"description": "A Construction Canvas drawing (a template, a house form, shapes, drawing commands or a canvas document), as a project file takes it; its levels set the level-by-level order.",
"additionalProperties": false
},
"takeoffs": {
"type": "array",
"items": {
"type": "object",
"required": [
"takeoff"
],
"properties": {
"takeoff": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$"
},
"leaveOut": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100,
"description": "Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour."
},
"selection": {
"type": "object",
"description": "Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"allowances": {
"type": "object",
"description": "Row → an allowance the reader sets: a percentage (cutting waste, overlap), or the option an allowance follows (a lay pattern). Row names are the takeoff's steps (the calculator slug, or the step key where one runs twice).",
"maxProperties": 50,
"additionalProperties": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "string",
"maxLength": 80
}
]
}
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
},
"measurements": {
"type": "object",
"description": "Measurement id → value, each length, area or volume with its unit (\"12 ft\", {\"value\": 3.6, \"unit\": \"m\"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure.",
"maxProperties": 50,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1,
"description": "Whole-job takeoffs, each an id and its measurements, as a project file takes them."
},
"workDays": {
"type": "array",
"items": {
"type": "integer",
"maximum": 7,
"minimum": 1
},
"default": [
1,
2,
3,
4,
5
],
"maxItems": 7,
"minItems": 1,
"description": "The days of the week worked, 1 Monday to 7 Sunday.",
"uniqueItems": true
},
"startDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Optional first day (YYYY-MM-DD): the working days are then given dates and a calendar file is returned. No date is assumed without it."
},
"hoursPerDay": {
"type": "number",
"default": 8,
"maximum": 24,
"minimum": 1,
"description": "Working hours in a crew's day."
}
},
"additionalProperties": false
}| figures* | object | The space's figures, by the planner's ids, each a length with its unit (a room: length, width, height, wallThickness; a fence: length, height; a stair: totalRise, width …). |
| windows | object |
| finishes | object | Surface role → finish id, by the planner's ids. |
| leaveOut | array | Branch ids to leave out. |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
{
"type": "object",
"required": [
"kind",
"figures"
],
"properties": {
"kind": {
"enum": [
"room",
"bathroom",
"slab",
"deck",
"driveway",
"fence",
"loft",
"retaining-wall",
"exterior-wall",
"stair"
],
"type": "string",
"description": "The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair."
},
"name": {
"type": "string",
"maxLength": 120
},
"doors": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"maximum": 20,
"minimum": 0
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"scope": {
"type": "object",
"description": "Scope question name → answer value, by the planner's ids.",
"maxProperties": 30,
"additionalProperties": {
"type": [
"string",
"number",
"boolean"
]
}
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"inputs": {
"type": "object",
"description": "Branch id → { calculator input id: value in its base unit }.",
"maxProperties": 50,
"additionalProperties": {
"type": "object",
"maxProperties": 30
}
},
"intent": {
"type": "string",
"maxLength": 40,
"description": "A trade, or everything."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"figures": {
"type": "object",
"description": "The space's figures, by the planner's ids, each a length with its unit (a room: length, width, height, wallThickness; a fence: length, height; a stair: totalRise, width …).",
"maxProperties": 10,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"windows": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"maximum": 20,
"minimum": 0
},
"width": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
},
"height": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"finishes": {
"type": "object",
"description": "Surface role → finish id, by the planner's ids.",
"maxProperties": 10,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"leaveOut": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100,
"description": "Branch ids to leave out."
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
}
},
"additionalProperties": false
}| object |
| Row → an allowance the reader sets: a percentage (cutting waste, overlap), or the option an allowance follows (a lay pattern). Row names are the takeoff's steps (the calculator slug, or the step key where one runs twice). |
| inputUnits | string | Send "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit. |
| measurements | object | Measurement id → value, each length, area or volume with its unit ("12 ft", {"value": 3.6, "unit": "m"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure. |
{
"type": "object",
"required": [
"takeoff"
],
"properties": {
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"market": {
"enum": [
"US",
"CA",
"UK",
"AU",
"INTL"
],
"type": "string",
"description": "Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"default": "metric",
"description": "The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."
},
"takeoff": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,119}$",
"description": "A takeoff id, such as concrete-slab."
},
"leaveOut": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100,
"description": "Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour."
},
"selection": {
"type": "object",
"description": "Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system.",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 80
}
},
"allowances": {
"type": "object",
"description": "Row → an allowance the reader sets: a percentage (cutting waste, overlap), or the option an allowance follows (a lay pattern). Row names are the takeoff's steps (the calculator slug, or the step key where one runs twice).",
"maxProperties": 50,
"additionalProperties": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "string",
"maxLength": 80
}
]
}
},
"inputUnits": {
"enum": [
"base"
],
"type": "string",
"description": "Send \"base\" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit."
},
"measurements": {
"type": "object",
"description": "Measurement id → value, each length, area or volume with its unit (\"12 ft\", {\"value\": 3.6, \"unit\": \"m\"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure.",
"maxProperties": 50,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 200
},
{
"type": "object",
"required": [
"value"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 40
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
]
}
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"have"
],
"properties": {
"have": {
"oneOf": [
{
"type": "number",
"exclusiveMinimum": 0
},
{
"type": "string",
"maxLength": 60
},
{
"type": "object",
"required": [
"value",
"unit"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 20
},
"value": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "How much the reader has: a count for counted things (20, \"20 sheets\"); a measure with its unit for paint, concrete, soil (\"24 gal\", \"2 m3\", {\"value\": 90, \"unit\": \"L\"})."
},
"page": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,80}$",
"description": "A Solve Backwards page's slug, such as wall-paint, drywall-sheets, bricks, concrete-bags, ready-mix-concrete."
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 2,
"description": "Or what the reader has, in words (\"sheets of drywall\", \"bags of concrete\"), when the slug is not known."
},
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"default": "full",
"description": "full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."
},
"system": {
"enum": [
"metric",
"imperial"
],
"type": "string",
"description": "The page's system; it sets the market's product (a 4 × 8 ft sheet in imperial). Left out: the unit's system, else metric."
},
"settings": {
"type": "object",
"description": "Optional: another calculator input, with its unit (a slab's thickness \"4 in\", coats 3). The inputs the page grows cannot be set.",
"maxProperties": 20,
"additionalProperties": {
"oneOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 60
},
{
"type": "object",
"required": [
"value",
"unit"
],
"properties": {
"unit": {
"type": "string"
},
"value": {
"type": "number"
}
}
}
]
}
}
},
"additionalProperties": false
}