{"openapi":"3.1.0","info":{"title":"BuildBatch assistant interface","version":"1","summary":"Ask a person the right questions, then get the shopping list for their room as data.","description":"BuildBatch is a free UK job planner for paint, wallpaper, tiles, flooring, carpet, sheet vinyl, skirting, plasterboard, loft insulation, a concrete slab and a patio. This interface lets an AI assistant find out what to ask a person (GET /ask.json), call the planner with their answers (GET /plan.json), and show them the finished list, with a link that opens the same list for them.\n\nThe list is the one the planner makes: the same code (list template 1.38.0) and, for the parameters, the same grammar as a list link (https://buildbatch.co.uk/links/). Only use measurements the person gave you; never guess one. No key, no account and no cookie: GET only, free, one room a call. An MCP client can use the same planner at https://buildbatch.co.uk/mcp, through four tools (quick_room_list, plan_room, find_guide, ask_questions) and one prompt.\n\nHonest limits, repeated in every answer (honesty): the figures are typical figures or labelled examples unless a product's own figures are sent; BuildBatch is built and checked with AI tools and nobody outside the build has reviewed it; an answer shows no price, and BuildBatch does not know whether a shop has an item; the person should check the figures and follow each product's own instructions.","termsOfService":"https://buildbatch.co.uk/terms/"},"servers":[{"url":"https://buildbatch.co.uk"}],"externalDocs":{"description":"The same thing for people, and how list links work","url":"https://buildbatch.co.uk/links/"},"paths":{"/ask.json":{"get":{"operationId":"getQuestionScript","summary":"What to ask the person","description":"The ordered questions to put to a person before calling /plan.json: the wording, the allowed answers, the parameter each fills, whether it is required, when to ask it, what to do if the person does not know, the typical rooms and door and window names, and rules for the assistant. Version 1; the script is generated from the planner's own tables.","responses":{"200":{"description":"The question script.","headers":{"Access-Control-Allow-Origin":{"description":"Any website may read this answer.","schema":{"type":"string","const":"*"}},"Cache-Control":{"description":"public, short-lived","schema":{"type":"string"}},"X-Robots-Tag":{"description":"noindex: the answer is for programs and is not a page for a search engine.","schema":{"type":"string","const":"noindex"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionScript"},"examples":{"questions":{"summary":"The first question (abridged: the real answer has every question)","x-request":"/ask.json","value":{"api":"buildbatch-assistant","document":"question-script","v":1,"questions":[{"id":"job","ask":"What are you planning to do in the room?","required":true,"fills":["job"]}]}}}}}}}}},"/plan.json":{"get":{"operationId":"planRoom","summary":"The shopping list for one room","description":"The whole shopping list for one room and one job, as data: what was understood (with anything defaulted or ignored named), the room summary, every line (what it is, its status, the quantity in real packs, why, what to check first, the working, the search words and each shop's own search link), the leftovers, the warnings, a link that opens the same list for the person (listUrl), and an honesty block to pass on. The parameters are a list link's, written as a query string. A job is required. No price is used: one sent is ignored and named. Limits: one room a call, 120 parameters, 4000 characters. A missing or unusable figure is a 400 that names the parameter and the question in /ask.json that asks for it.","parameters":[{"name":"v","in":"query","required":false,"description":"The version of the format. 1. Left out, 1 is assumed and the answer says so.","schema":{"type":"integer","enum":["1"]},"example":"1"},{"name":"job","in":"query","required":true,"description":"The job. Required. wallpaper is the paint job with papered walls and no ceiling; tiles is the paint job with tiled walls and no ceiling; both is paint and a new floor; paint-carpet is paint and carpet from a roll; skirting is skirting and architrave. Also read: trim, paint-and-flooring, paint-and-carpet.","schema":{"type":"string","enum":["paint","wallpaper","tiles","flooring","carpet","loft","both","paint-carpet","skirting","plasterboard","concrete","patio"]},"example":"paint"},{"name":"units","in":"query","required":false,"description":"What length, width, height and the doors are measured in. Default m. In ft write 13ft9in, or 13 for whole feet.","schema":{"type":"string","enum":["m","cm","mm","ft"],"default":"m"},"example":"m"},{"name":"length","in":"query","required":false,"description":"One side of the floor, in the units. A length may carry its own unit (360cm, 4200mm). Not needed when plan is given.","schema":{"type":"string"},"example":"4.2"},{"name":"width","in":"query","required":false,"description":"The other side of the floor, in the units. Not needed when plan is given.","schema":{"type":"string"},"example":"3.6"},{"name":"area","in":"query","required":false,"description":"Loft insulation, concrete, a patio and a floor (laminate, wood, vinyl planks or floor tiles) only: the floor's area in square metres, up to 900, instead of length and width. How far it is round is then not known: the formwork, the edging or the scotia beading is a check without a length, and new skirting needs the length and width.","schema":{"type":"number"},"example":"20"},{"name":"height","in":"query","required":false,"description":"Floor to ceiling, in the units. Needed when walls are painted, papered, tiled or boarded (paint-carpet too); not for flooring, carpet, loft insulation, concrete or skirting alone.","schema":{"type":"string"},"example":"2.4"},{"name":"plan","in":"query","required":false,"description":"A room that is not a rectangle: its corners in turn, in metres whatever units says, as x,y pairs separated by \";\". Replaces length and width. Up to 24 corners.","schema":{"type":"string"},"example":"0,0;4.2,0;4.2,2.4;2.4,2.4;2.4,3.6;0,3.6"},{"name":"door","in":"query","required":false,"description":"One per door, the key repeated for more. A typical size by name (the names are in /ask.json) or width x height in the units. Add *2 for two the same.","schema":{"type":"array","items":{"type":"string"}},"example":"int-762","style":"form","explode":true},{"name":"window","in":"query","required":false,"description":"One per window, the key repeated for more. A typical size by name or width x height in the units. Add *2 for two the same.","schema":{"type":"array","items":{"type":"string"}},"example":"win-standard","style":"form","explode":true},{"name":"opening","in":"query","required":false,"description":"Any other opening to take off the walls (a garage door, an archway), as width x height or a name. The key may be repeated.","schema":{"type":"array","items":{"type":"string"}},"example":"1800x2100","style":"form","explode":true},{"name":"bath","in":"query","required":false,"description":"A bath or shower tray: a name (bath-1700, tray-900) or its length along the wall x its rim height x how far it comes into the room, in the units. The wall behind it comes off up to the rim, and its footprint off a floor being laid. The key may be repeated.","schema":{"type":"array","items":{"type":"string"}},"example":"bath-1700","style":"form","explode":true},{"name":"walls","in":"query","required":false,"description":"What the walls get. The job sets it, so it is rarely needed: paint, wallpaper, tiles, board or none.","schema":{"type":"string","enum":["paint","wallpaper","tiles","board","none"]},"example":"none"},{"name":"ceiling","in":"query","required":false,"description":"What the ceiling gets: paint, or board on the plasterboard job, or none. Another word is named in ignored[] and the job's own choice used.","schema":{"type":"string","enum":["paint","board","none"]},"example":"none"},{"name":"walls.length","in":"query","required":false,"description":"Paint, tiles or wallpaper on some walls only (a splashback, a shower's walls, a feature wall): the total length of the walls covered, in the units. It replaces the room's perimeter for the paint, the tiles' area and the paper's drops; doors and windows are then not taken off. Left out: all the walls. Sent with a height and with no length, width, plan or area, it is a wall on its own: the room is not needed (walls only: no ceiling, woodwork, floor or skirting).","schema":{"type":"string"},"example":"3"},{"name":"woodwork","in":"query","required":false,"description":"Paint jobs only: paint when the woodwork is painted too (this room's doors, their architraves, the windows' frames and the skirting, counted from the doors and windows given and the room's perimeter, in satinwood at a typical coverage). With walls=none and ceiling=none, the woodwork on its own. Left out: not painted.","schema":{"type":"string","enum":["paint","none"]},"example":"paint"},{"name":"trim","in":"query","required":false,"description":"New skirting, architrave or both (skirting,architrave), with any job in a room; a loft floor, a slab and a patio take none. Default skirting for the skirting job, else none.","schema":{"type":"string","enum":["skirting","architrave","skirting,architrave","none"]},"example":"skirting,architrave"},{"name":"surface","in":"query","required":false,"description":"What the painted surfaces are like now. Default sound, the planner's own default. Used by painting jobs.","schema":{"type":"string","enum":["sound","new-bare","stained","damp-mould","flaking-glossy","other"],"default":"sound"},"example":"sound"},{"name":"newplaster","in":"query","required":false,"description":"Painting jobs: is any of it new or bare plaster? yes adds a mist coat of white contract matt on its own line and leaves the sugar soap out; no is a sound painted surface. Left out, the list is a sound room's and its primer line carries the question to ask.","schema":{"type":"string","enum":["yes","no"]},"example":"no"},{"name":"colourchange","in":"query","required":false,"description":"Painting jobs: is the colour going much lighter or darker? yes adds one coat to the walls. Left out, two coats are counted and the wall paint's line carries the question to ask.","schema":{"type":"string","enum":["yes","no"]},"example":"no"},{"name":"skirtingoff","in":"query","required":false,"description":"Flooring jobs: is the skirting coming off, to go back over the new floor's edge? yes leaves the scotia beading out; no counts it in 2.4 m lengths. Left out, the beading is counted and its line carries the question to ask.","schema":{"type":"string","enum":["yes","no"]},"example":"no"},{"name":"woodsurface","in":"query","required":false,"description":"With woodwork=paint: what the woodwork is like now. Default sound (painted before and sound). bare adds a check line for knotting, primer and undercoat; flaking adds the note about old paint.","schema":{"type":"string","enum":["sound","bare","flaking"],"default":"sound"},"example":"bare"},{"name":"subfloor","in":"query","required":false,"description":"What is under a new floor. Default unsure. Used by flooring jobs.","schema":{"type":"string","enum":["timber","concrete","existing","unsure"],"default":"unsure"},"example":"timber"},{"name":"ground","in":"query","required":false,"description":"Whether the floor is on the ground floor. Default unsure. Used by flooring jobs.","schema":{"type":"string","enum":["yes","no","unsure"],"default":"unsure"},"example":"no"},{"name":"fitting","in":"query","required":false,"description":"How the floor is fitted. Default unsure. Used by flooring jobs.","schema":{"type":"string","enum":["click","glue","nail","unsure"],"default":"unsure"},"example":"click"},{"name":"wallpaint","in":"query","required":false,"description":"Whether the wall paint uses the labelled example figures (quick) or figures read off the tin (custom). Needed for the keys below to take effect.","schema":{"type":"string","enum":["quick","custom"]},"example":"custom"},{"name":"wallpaint.coats","in":"query","required":false,"description":"Coats on the tin, for the wall paint. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"2"},{"name":"wallpaint.coverage","in":"query","required":false,"description":"Metres squared covered by one litre in one coat, from the tin, for the wall paint. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"12"},{"name":"wallpaint.extra","in":"query","required":false,"description":"Percent to add for waste and touch-ups, for the wall paint. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"10"},{"name":"wallpaint.tins","in":"query","required":false,"description":"Tin sizes in litres, comma separated, for the wall paint. A size may carry a price after \"@\": the price is accepted and ignored.","schema":{"type":"string"},"example":"2.5,5"},{"name":"wallpaint.examples","in":"query","required":false,"description":"Which of coats, coverage, extra and tins are still the labelled example figures. Leave it out unless the planner wrote it.","schema":{"type":"string"},"example":"none"},{"name":"ceilingpaint","in":"query","required":false,"description":"Whether the ceiling paint uses the labelled example figures (quick) or figures read off the tin (custom). Needed for the keys below to take effect.","schema":{"type":"string","enum":["quick","custom"]},"example":"custom"},{"name":"ceilingpaint.coats","in":"query","required":false,"description":"Coats on the tin, for the ceiling paint. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"2"},{"name":"ceilingpaint.coverage","in":"query","required":false,"description":"Metres squared covered by one litre in one coat, from the tin, for the ceiling paint. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"12"},{"name":"ceilingpaint.extra","in":"query","required":false,"description":"Percent to add for waste and touch-ups, for the ceiling paint. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"10"},{"name":"ceilingpaint.tins","in":"query","required":false,"description":"Tin sizes in litres, comma separated, for the ceiling paint. A size may carry a price after \"@\": the price is accepted and ignored.","schema":{"type":"string"},"example":"2.5,5"},{"name":"ceilingpaint.examples","in":"query","required":false,"description":"Which of coats, coverage, extra and tins are still the labelled example figures. Leave it out unless the planner wrote it.","schema":{"type":"string"},"example":"none"},{"name":"woodpaint","in":"query","required":false,"description":"Whether the woodwork paint (with woodwork=paint) uses the labelled example figures (quick) or figures read off the tin (custom). Needed for the keys below to take effect.","schema":{"type":"string","enum":["quick","custom"]},"example":"custom"},{"name":"woodpaint.coats","in":"query","required":false,"description":"Coats on the tin, for the woodwork paint (with woodwork=paint). With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"2"},{"name":"woodpaint.coverage","in":"query","required":false,"description":"Metres squared covered by one litre in one coat, from the tin, for the woodwork paint (with woodwork=paint). With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"12"},{"name":"woodpaint.extra","in":"query","required":false,"description":"Percent to add for waste and touch-ups, for the woodwork paint (with woodwork=paint). With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"10"},{"name":"woodpaint.tins","in":"query","required":false,"description":"Tin sizes in litres, comma separated, for the woodwork paint (with woodwork=paint). A size may carry a price after \"@\": the price is accepted and ignored.","schema":{"type":"string"},"example":"2.5,5"},{"name":"woodpaint.examples","in":"query","required":false,"description":"Which of coats, coverage, extra and tins are still the labelled example figures. Leave it out unless the planner wrote it.","schema":{"type":"string"},"example":"none"},{"name":"floor","in":"query","required":false,"description":"Whether the flooring uses the labelled example figures (quick) or figures read off the pack (custom). Needed for the keys below to take effect.","schema":{"type":"string","enum":["quick","custom"]},"example":"quick"},{"name":"floor.covering","in":"query","required":false,"description":"What the floor is. Default laminate.","schema":{"type":"string","enum":["laminate","engineered","vinylPlank","tile"]},"example":"laminate"},{"name":"floor.pattern","in":"query","required":false,"description":"How the floor is laid: straight, brick, diagonal or herringbone. A diagonal or herringbone lay takes 15% for cuts where a straight lay takes 10%, unless floor.extra gives another figure. Left out: straight.","schema":{"type":"string"},"example":"straight"},{"name":"floor.extra","in":"query","required":false,"description":"Percent to add for cuts. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"10"},{"name":"floor.packs","in":"query","required":false,"description":"Metres squared in one pack or box, comma separated for several sizes. A size may carry a price after \"@\": the price is accepted and ignored. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"string"},"example":"2.2"},{"name":"floor.examples","in":"query","required":false,"description":"Which of extra and packs are still the labelled example figures. Leave it out unless the planner wrote it.","schema":{"type":"string"},"example":"none"},{"name":"floor.typical","in":"query","required":false,"description":"Since template 1.37.0: packs, when floor.packs is one of the typical laminate sizes the planner offers beside its number, so the pack stays a typical figure that names its maker. Leave it out unless the planner wrote it.","schema":{"type":"string","enum":["packs"]},"example":"packs"},{"name":"floor.underlay","in":"query","required":false,"description":"Whether underlay is needed.","schema":{"type":"string","enum":["need","have","not-needed","unsure"]},"example":"need"},{"name":"floor.underlay.roll","in":"query","required":false,"description":"Metres squared in one roll of underlay.","schema":{"type":"number"},"example":"15"},{"name":"floor.underlay.price","in":"query","required":false,"description":"Accepted and ignored: this interface uses no prices.","schema":{"type":"number"},"example":"12","deprecated":true},{"name":"floor.adhesive","in":"query","required":false,"description":"Floor tiles: metres squared one bag of adhesive covers.","schema":{"type":"number"},"example":"4"},{"name":"floor.grout","in":"query","required":false,"description":"Floor tiles: metres squared one bag of grout covers.","schema":{"type":"number"},"example":"6"},{"name":"floor.tilew","in":"query","required":false,"description":"Floor tiles: one side of a tile, in millimetres, for a count of tiles (with floor.tileh). Optional; the boxes are still counted by area.","schema":{"type":"number"},"example":"600"},{"name":"floor.tileh","in":"query","required":false,"description":"Floor tiles: the other side of a tile, in millimetres (with floor.tilew).","schema":{"type":"number"},"example":"600"},{"name":"floor.joint","in":"query","required":false,"description":"Floor tiles: the joint width in millimetres. With the tile size, the grout is counted by the makers' rule; left out, a typical 3 mm joint is used and said so.","schema":{"type":"number"},"example":"3"},{"name":"floor.depth","in":"query","required":false,"description":"Floor tiles: the tile's thickness in millimetres, for the grout. Left out, a typical 10 mm is used and said so.","schema":{"type":"number"},"example":"10"},{"name":"floor.trowel","in":"query","required":false,"description":"Floor tiles: the notched trowel, 6 or 12 (mm). The adhesive is counted from it; left out, the one the adhesive maker's sheet gives for the tile's size (6 up to 300 mm on its long side, 12 above).","schema":{"type":"number"},"example":"12"},{"name":"floor.adhesivebag","in":"query","required":false,"description":"Floor tiles: the weight of one bag of adhesive in kilograms; 20 when left out.","schema":{"type":"number"},"example":"20"},{"name":"floor.groutbag","in":"query","required":false,"description":"Floor tiles: the weight of one bag of grout in kilograms; 5 when left out.","schema":{"type":"number"},"example":"5"},{"name":"carpet","in":"query","required":false,"description":"Whether the carpet uses the labelled example roll figures (quick) or figures from the carpet and shop (custom). Needed for the keys below to take effect.","schema":{"type":"string","enum":["quick","custom"]},"example":"custom"},{"name":"carpet.width","in":"query","required":false,"description":"The fixed width of the carpet roll in metres. Left out with carpet=quick: the standard width (4 or 5 m; 2, 3 or 4 m for sheet vinyl) that needs least roll for the room, said so on the list.","schema":{"type":"number"},"example":"4"},{"name":"carpet.allowance","in":"query","required":false,"description":"The trimming allowance in metres, added once to each room measurement.","schema":{"type":"number"},"example":"0.1"},{"name":"carpet.step","in":"query","required":false,"description":"The step in metres in which the shop sells the cut length.","schema":{"type":"number"},"example":"0.1"},{"name":"carpet.underlay","in":"query","required":false,"description":"Metres squared covered by one chosen underlay roll or pack.","schema":{"type":"number"},"example":"15.07"},{"name":"carpet.direction","in":"query","required":false,"description":"Which way the pile or pattern must run. Not decided lets the planner show the smaller one-piece cut that fits.","schema":{"type":"string","enum":["auto","length","width"],"default":"auto"},"example":"auto"},{"name":"carpet.covering","in":"query","required":false,"description":"What is laid from the roll: carpet (with underlay and gripper) or sheet vinyl (loose laid, taped or glued; no underlay). Sheet vinyl is sold in 2, 3 and 4 m widths; its quick example is a 3 m roll.","schema":{"type":"string","enum":["carpet","vinyl"],"default":"carpet"},"example":"carpet"},{"name":"loft","in":"query","required":false,"description":"Whether the loft insulation uses labelled example figures (quick) or figures measured in the loft and read from the chosen roll (custom). Needed for the keys below to take effect.","schema":{"type":"string","enum":["quick","custom"]},"example":"custom"},{"name":"loft.existing","in":"query","required":false,"description":"Existing insulation depth in millimetres.","schema":{"type":"number"},"example":"100"},{"name":"loft.target","in":"query","required":false,"description":"Chosen target insulation depth in millimetres.","schema":{"type":"number"},"example":"270"},{"name":"loft.depth","in":"query","required":false,"description":"Thickness of one new mineral-wool layer in millimetres, from the chosen roll.","schema":{"type":"number"},"example":"170"},{"name":"loft.pack","in":"query","required":false,"description":"Square metres covered by one chosen roll or pack; optional for a 100, 150, 170 or 200 mm roll, whose typical coverage (the maker's, as the shops' feeds name it) is used and said so.","schema":{"type":"number"},"example":"8.01"},{"name":"loft.extra","in":"query","required":false,"description":"Percent to add for cuts and fitting.","schema":{"type":"number"},"example":"5"},{"name":"loft.over","in":"query","required":false,"description":"Thickness in millimetres of a second roll laid across the joists over one layer of the first; optional. With it, the first roll is one layer between the joists and the rest is this roll.","schema":{"type":"number"},"example":"170"},{"name":"loft.overpack","in":"query","required":false,"description":"Square metres one roll of the second insulation covers; optional for a 100, 150, 170 or 200 mm roll.","schema":{"type":"number"},"example":"8.01"},{"name":"concrete","in":"query","required":false,"description":"Whether the concrete slab uses labelled example figures (quick) or the thickness decided for the job and figures read off the bag (custom). Needed for the keys below to take effect. The room is the slab: its length and width, no height.","schema":{"type":"string","enum":["quick","custom"]},"example":"custom"},{"name":"concrete.thickness","in":"query","required":false,"description":"Slab thickness in millimetres, decided for the job. BuildBatch suggests none. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"100"},{"name":"concrete.extra","in":"query","required":false,"description":"Percent to add for an uneven base and spillage. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"10"},{"name":"concrete.supply","in":"query","required":false,"description":"bags: bags of dry mix; mix: cement with sand and aggregate, mixed on site; mixed: ready-mixed concrete, delivered by the cubic metre. Mind the two: \"mix\" is mixed on site, \"mixed\" arrives mixed. Left out, the planner follows the slab's volume (bags up to 0.25 m³, mixed on site up to 1 m³, ready-mixed above) and the answer says what each of the three ways takes.","schema":{"type":"string","enum":["bags","mix","mixed"]},"example":"bags"},{"name":"concrete.yield","in":"query","required":false,"description":"Cubic metres one bag makes, as printed on the bag. Bags only. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"0.01"},{"name":"concrete.weight","in":"query","required":false,"description":"The weight of one bag in kilograms. Bags only. With quick, a figure sent here is used and labelled as the person's; the ones not sent stay the labelled examples.","schema":{"type":"number"},"example":"20"},{"name":"concrete.step","in":"query","required":false,"description":"The step in cubic metres the supplier sells ready-mixed concrete in. Ready-mixed only; optional.","schema":{"type":"number"},"example":"0.25"},{"name":"concrete.mix","in":"query","required":false,"description":"Which of the maker's published mixes the cement, sand and aggregate follow: general purpose, paving or foundation. Mixed on site only.","schema":{"type":"string","enum":["general","paving","foundation"]},"example":"general"},{"name":"concrete.aggregate","in":"query","required":false,"description":"Whether the aggregate is bought as all-in ballast or as sharp sand and coarse aggregate. Mixed on site only.","schema":{"type":"string","enum":["ballast","separate"]},"example":"ballast"},{"name":"concrete.subdepth","in":"query","required":false,"description":"Depth of the sub-base under the slab in millimetres, decided for the job; optional. With it, the sub-base is counted in bulk bags or 25 kg bags from a typical figure that names its source.","schema":{"type":"number"},"example":"150"},{"name":"concrete.bags","in":"query","required":false,"description":"How the sand, aggregate or ballast of a mix on site, and the sub-base, are bought: bulk (bulk bags of about 800 kg) or bags (25 kg bags). Bulk unless given; each is counted in whole bags from a typical figure that names its source.","schema":{"type":"string"},"example":"bulk"},{"name":"concrete.examples","in":"query","required":false,"description":"Which of thickness, extra, yield and weight are still the labelled example figures (thickness left out of it is one the person chose). Leave it out unless the planner wrote it.","schema":{"type":"string"},"example":"extra,yield,weight"},{"name":"patio","in":"query","required":false,"description":"Whether the patio uses labelled example figures (quick: a 600 × 600 mm slab, the makers' 10 mm joint, 10% for cuts, a 30 mm bed at 1 : 4) or figures entered from the slab and the guides (custom). Needed for the keys below to take effect. The room is the patio: its length and width, no height.","schema":{"type":"string","enum":["quick","custom"]},"example":"custom"},{"name":"patio.width","in":"query","required":false,"description":"One side of a slab in millimetres.","schema":{"type":"number"},"example":"600"},{"name":"patio.length","in":"query","required":false,"description":"The other side of a slab in millimetres.","schema":{"type":"number"},"example":"600"},{"name":"patio.joint","in":"query","required":false,"description":"Joint width in millimetres. The makers' guides give 10 mm as the minimum.","schema":{"type":"number"},"example":"10"},{"name":"patio.extra","in":"query","required":false,"description":"Percent to add for cuts.","schema":{"type":"number"},"example":"10"},{"name":"patio.pack","in":"query","required":false,"description":"How many slabs a pack holds, a whole number; optional. With it, whole packs are counted.","schema":{"type":"number"},"example":"20"},{"name":"patio.covers","in":"query","required":false,"description":"Square metres one pack covers, from the pack, for a project pack of mixed sizes; optional, and it beats patio.pack. With it, whole packs are counted by area.","schema":{"type":"number"},"example":"9"},{"name":"patio.bed","in":"query","required":false,"description":"Depth of the full mortar bed in millimetres, before tamping. The makers' guides give 30 to 40 mm.","schema":{"type":"number"},"example":"30"},{"name":"patio.cement","in":"query","required":false,"description":"Parts of cement in the bed, by volume.","schema":{"type":"number"},"example":"1"},{"name":"patio.sand","in":"query","required":false,"description":"Parts of sharp sand in the bed, by volume. The guides give 3 or 4 to 1 of cement.","schema":{"type":"number"},"example":"4"},{"name":"patio.bag","in":"query","required":false,"description":"What one bag of cement fills in litres, from the bag; optional. Without it the bags are counted from a typical 17 L a 25 kg bag, said to be typical.","schema":{"type":"number"},"example":"18"},{"name":"patio.primer","in":"query","required":false,"description":"Square metres one tub of slurry primer covers, from the tub; optional. Without it the tubs are counted from a typical 12 m² a tub, said to be typical.","schema":{"type":"number"},"example":"8"},{"name":"patio.jointing","in":"query","required":false,"description":"Square metres one pail of jointing compound covers at your joint, from the pail; optional. Without it the pails are counted from a typical 7 m² a pail, said to be typical.","schema":{"type":"number"},"example":"19"},{"name":"patio.subdepth","in":"query","required":false,"description":"Depth of the sub-base under the patio in millimetres, decided for the job; optional. Without it the makers' usual minimum of 100 mm is used, said to be typical.","schema":{"type":"number"},"example":"100"},{"name":"patio.house","in":"query","required":false,"description":"Whether the patio is against the house along one side: yes or no. It decides how many edges the sub-base runs 150 mm past and how much edge restraint is counted. Left out, it is counted as against the house along its longest side, and the sub-base line carries the question.","schema":{"type":"string"},"example":"yes"},{"name":"patio.bags","in":"query","required":false,"description":"How the sand and the sub-base are bought: bulk (bulk bags of about 800 kg) or bags (25 kg bags). Bulk unless given; each is counted in whole bags from a typical figure that names its source.","schema":{"type":"string"},"example":"bulk"},{"name":"patio.examples","in":"query","required":false,"description":"Which of width and length are still the labelled example slab (the 600 × 600 mm one ticked to start with). Leave it out unless the planner wrote it.","schema":{"type":"string"},"example":"width,length"},{"name":"laystart","in":"query","required":false,"description":"Floor tiles, and a patio, given as length and width or a plan (not an area), straight or brick laid: where the laying starts. centre (the middle of the room), corner (whole tiles along two walls) or house (a patio only: whole slabs along the house wall). Left out, the start needing the fewest cuts and tiles is used, or the house wall for a patio against the house; the answer says which and counts that layout.","schema":{"type":"string","enum":["centre","corner","house"]},"example":"corner"},{"name":"paper","in":"query","required":false,"description":"Whether the wallpaper is the labelled example roll (quick) or read off the label (custom). Needed for the keys below to take effect.","schema":{"type":"string","enum":["quick","custom"]},"example":"custom"},{"name":"paper.width","in":"query","required":false,"description":"Roll width in centimetres. Custom only: with quick the example is used, and a figure sent here is named in ignored[] as not used.","schema":{"type":"number"},"example":"53"},{"name":"paper.length","in":"query","required":false,"description":"Roll length in metres. Custom only: with quick the example is used, and a figure sent here is named in ignored[] as not used.","schema":{"type":"number"},"example":"10.05"},{"name":"paper.repeat","in":"query","required":false,"description":"Pattern repeat in centimetres. 0 or left out for none.","schema":{"type":"number"},"example":"0"},{"name":"paper.match","in":"query","required":false,"description":"How the pattern lines up. straight and half-drop need paper.repeat. unsure, or left out with no repeat, is counted as a straight match with a 64 cm repeat (three drops a roll at an ordinary ceiling), which keeps the rolls from running short; the line names it.","schema":{"type":"string","enum":["free","straight","half-drop","unsure"]},"example":"free"},{"name":"paper.price","in":"query","required":false,"description":"Accepted and ignored: this interface uses no prices.","schema":{"type":"number"},"example":"19","deprecated":true},{"name":"paper.paste","in":"query","required":false,"description":"Rolls one packet of paste does.","schema":{"type":"number"},"example":"5"},{"name":"walltiles","in":"query","required":false,"description":"Whether the wall tiles are the labelled example box (quick) or read off the box (custom). Needed for the keys below to take effect.","schema":{"type":"string","enum":["quick","custom"]},"example":"quick"},{"name":"walltiles.height","in":"query","required":false,"description":"Metres up the wall the tiles go. Left out: to the ceiling.","schema":{"type":"number"},"example":"1.2"},{"name":"walltiles.fullrun","in":"query","required":false,"description":"Metres of wall tiled to the ceiling round a bath or shower, with walltiles.height for the rest (a bathroom's two heights). Left out: none.","schema":{"type":"number"},"example":"3.1"},{"name":"walltiles.above","in":"query","required":false,"description":"yes when the wall above tiles that stop below the ceiling is painted on the same list; no, or left out, leaves it off.","schema":{"type":"string"},"example":"yes"},{"name":"wallpaint.colour","in":"query","required":false,"description":"The wall paint's colour: magnolia, or colour for a colour no partner shop sells (counted in 2.5 L tins and priced only once its price is typed). Left out: white.","schema":{"type":"string"},"example":"colour"},{"name":"wallpaint.finish","in":"query","required":false,"description":"The wall paint's finish. Left out: matt.","schema":{"type":"string"},"example":"silk"},{"name":"wallpaint.name","in":"query","required":false,"description":"The name of a coloured wall paint (up to 60 characters), which the shops are searched for. Read with wallpaint.colour=colour only.","schema":{"type":"string"},"example":"Farrow & Ball Estate"},{"name":"breast","in":"query","required":false,"description":"A chimney breast on a wall of the rectangle: width x depth @ wall, in the room's units; the wall is L1, W1, L2 or W2. One a wall.","schema":{"type":"string"},"example":"1.2x0.35@L1"},{"name":"bay","in":"query","required":false,"description":"A bay on a wall of the rectangle, going out: width x depth @ wall. One a wall.","schema":{"type":"string"},"example":"2.4x0.7@W1"},{"name":"alcove","in":"query","required":false,"description":"An alcove on a wall of the rectangle, going out: width x depth @ wall. One a wall.","schema":{"type":"string"},"example":"1x0.4@L2"},{"name":"walltiles.box","in":"query","required":false,"description":"Metres squared in one box. Custom only: with quick the example is used, and a figure sent here is named in ignored[] as not used.","schema":{"type":"number"},"example":"1.44"},{"name":"walltiles.pattern","in":"query","required":false,"description":"How the wall tiles are laid: straight, brick, diagonal or herringbone. A diagonal or herringbone lay takes 15% for cuts where a straight lay takes 10%, unless walltiles.extra gives another figure. Left out: straight.","schema":{"type":"string"},"example":"straight"},{"name":"walltiles.reveal","in":"query","required":false,"description":"How deep the window reveals are, in millimetres, on walls tiled to the ceiling: the reveals are tiled too. Left out: 150, an example depth, said to be one. 0 leaves them out.","schema":{"type":"number"},"example":"150"},{"name":"walltiles.extra","in":"query","required":false,"description":"Percent to add for cuts. Custom only: with quick the example is used, and a figure sent here is named in ignored[] as not used.","schema":{"type":"number"},"example":"10"},{"name":"walltiles.price","in":"query","required":false,"description":"Accepted and ignored: this interface uses no prices.","schema":{"type":"number"},"example":"25","deprecated":true},{"name":"walltiles.adhesive","in":"query","required":false,"description":"Metres squared one bag of adhesive covers.","schema":{"type":"number"},"example":"4"},{"name":"walltiles.grout","in":"query","required":false,"description":"Metres squared one bag of grout covers.","schema":{"type":"number"},"example":"6"},{"name":"walltiles.tilew","in":"query","required":false,"description":"One side of a wall tile, in millimetres, for a count of tiles (with walltiles.tileh). Optional; the boxes are still counted by area.","schema":{"type":"number"},"example":"300"},{"name":"walltiles.tileh","in":"query","required":false,"description":"The other side of a wall tile, in millimetres (with walltiles.tilew).","schema":{"type":"number"},"example":"600"},{"name":"walltiles.joint","in":"query","required":false,"description":"The joint width in millimetres. With the tile size, the grout is counted by the makers' rule; left out, a typical 2 mm joint is used and said so.","schema":{"type":"number"},"example":"2"},{"name":"walltiles.depth","in":"query","required":false,"description":"The wall tile's thickness in millimetres, for the grout. Left out, a typical 8 mm is used and said so.","schema":{"type":"number"},"example":"8"},{"name":"walltiles.trowel","in":"query","required":false,"description":"The notched trowel, 6 or 12 (mm). The adhesive is counted from it; left out, by the tile's size: 6 for a tile up to 600 mm on its long side, 12 for a larger one.","schema":{"type":"number"},"example":"6"},{"name":"walltiles.adhesivebag","in":"query","required":false,"description":"The weight of one bag of adhesive in kilograms; 20 when left out.","schema":{"type":"number"},"example":"20"},{"name":"walltiles.groutbag","in":"query","required":false,"description":"The weight of one bag of grout in kilograms; 5 when left out.","schema":{"type":"number"},"example":"5"},{"name":"lengths","in":"query","required":false,"description":"Whether the skirting and architrave lengths are the labelled examples (quick) or the lengths the shop sells (custom). Needed for the keys below to take effect.","schema":{"type":"string","enum":["quick","custom"]},"example":"custom"},{"name":"lengths.skirting","in":"query","required":false,"description":"Length the skirting is sold in, in metres. Custom only: with quick the example is used, and a figure sent here is named in ignored[] as not used.","schema":{"type":"number"},"example":"4.2"},{"name":"lengths.skirting.price","in":"query","required":false,"description":"Accepted and ignored: this interface uses no prices.","schema":{"type":"number"},"example":"9.5","deprecated":true},{"name":"lengths.architrave","in":"query","required":false,"description":"Length the architrave is sold in, in metres. Custom only: with quick the example is used, and a figure sent here is named in ignored[] as not used.","schema":{"type":"number"},"example":"2.1"},{"name":"trim.breasts","in":"query","required":false,"description":"How many chimney breasts the new skirting goes round: each adds its two returns. Left out: none.","schema":{"type":"number"},"example":"1"},{"name":"trim.breastdepth","in":"query","required":false,"description":"How deep a chimney breast is, in millimetres. Left out: 350, an example depth, said to be one.","schema":{"type":"number"},"example":"350"},{"name":"lengths.architrave.price","in":"query","required":false,"description":"Accepted and ignored: this interface uses no prices.","schema":{"type":"number"},"example":"7","deprecated":true},{"name":"board","in":"query","required":false,"description":"Whether the plasterboard uses labelled example figures (quick) or figures from the board and system specification (custom). Needed for the keys below to take effect.","schema":{"type":"string","enum":["quick","custom"]},"example":"quick"},{"name":"board.width","in":"query","required":false,"description":"Board width in metres. Custom only: with quick the example is used, and a figure sent here is named in ignored[] as not used.","schema":{"type":"number"},"example":"1.2"},{"name":"board.length","in":"query","required":false,"description":"Board length in metres. Custom only: with quick the example is used, and a figure sent here is named in ignored[] as not used.","schema":{"type":"number"},"example":"2.4"},{"name":"board.layers","in":"query","required":false,"description":"Whole layers from the complete system specification. Custom only: with quick the example is used, and a figure sent here is named in ignored[] as not used.","schema":{"type":"integer"},"example":"1"},{"name":"board.extra","in":"query","required":false,"description":"Percent to add for cuts. Custom only: with quick the example is used, and a figure sent here is named in ignored[] as not used.","schema":{"type":"number"},"example":"10"},{"name":"board.finish","in":"query","required":false,"description":"How the boards will be finished.","schema":{"type":"string","enum":["skim","joint","unsure"]},"example":"skim"},{"name":"board.skim","in":"query","required":false,"description":"Metres squared one bag of finish plaster covers, from the bag.","schema":{"type":"number"},"example":"10"},{"name":"board.fixing","in":"query","required":false,"description":"How the boards will be fixed.","schema":{"type":"string","enum":["screws","adhesive","unsure"]},"example":"screws"},{"name":"board.adhesive","in":"query","required":false,"description":"Wall boards one bag of plasterboard adhesive fixes, from its instructions.","schema":{"type":"number"},"example":"2"},{"name":"need","in":"query","required":false,"description":"Line ids, comma separated, to mark Need before the list is made. The ids are in the answer's lines. Rarely needed.","schema":{"type":"string"},"example":"tools.roller"},{"name":"check","in":"query","required":false,"description":"Line ids, comma separated, to mark Check first before the list is made. The ids are in the answer's lines. Rarely needed.","schema":{"type":"string"},"example":"tools.roller"},{"name":"have","in":"query","required":false,"description":"Line ids, comma separated, to mark Already have before the list is made. The ids are in the answer's lines. Rarely needed.","schema":{"type":"string"},"example":"tools.roller"},{"name":"not-needed","in":"query","required":false,"description":"Line ids, comma separated, to mark Not needed before the list is made. The ids are in the answer's lines. Rarely needed.","schema":{"type":"string"},"example":"tools.roller"},{"name":"name","in":"query","required":false,"description":"What the room is called. Do not send one: it is carried into the links the answer gives, and the person can add it there.","schema":{"type":"string"},"example":"Front bedroom"},{"name":"t","in":"query","required":false,"description":"Written by the planner in a sent list link: the Room Refresh template version the sender's screen used, so that the screen that opens it can say when the figures have moved since. Leave it out of a call.","schema":{"type":"string"},"example":"1.33.0"},{"name":"p","in":"query","required":false,"description":"Written by the planner in a sent list link: the day of the shop prices the sender's screen used (YYYY-MM-DD), so that the screen that opens it can say when the prices have moved since. Leave it out of a call.","schema":{"type":"string"},"example":"2026-10-17"},{"name":"end","in":"query","required":false,"description":"Written by the planner as the last pair of a list link: the number of pairs before it. Leave it out of a call.","schema":{"type":"integer"},"example":"12"}],"responses":{"200":{"description":"The list.","headers":{"Access-Control-Allow-Origin":{"description":"Any website may read this answer.","schema":{"type":"string","const":"*"}},"Cache-Control":{"description":"public, short-lived","schema":{"type":"string"}},"X-Robots-Tag":{"description":"noindex: the answer is for programs and is not a page for a search engine.","schema":{"type":"string","const":"noindex"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanAnswer"},"examples":{"paintRoom":{"summary":"Paint the walls and ceiling of a 4.2 by 3.6 m room, 2.4 m high, with a standard internal door and a window 1.2 by 1.1 m (abridged)","x-request":"/plan.json?v=1&job=paint&length=4.2&width=3.6&height=2.4&door=int-762&window=1.2x1.1","value":{"api":"buildbatch-assistant","document":"plan","v":1,"ok":true,"understood":{"job":"paint","work":"Paint","walls":"paint","ceiling":"paint"},"room":{"floorAreaM2":15.12,"perimeterM":15.6,"doors":1,"windows":1},"lines":[{"id":"paint.walls","label":"Wall paint","status":"need","quantity":"1 × 5 L tin + 1 × 2.5 L tin (7.5 L)","packs":[{"count":1,"label":"5 L tin","size":5,"unit":"L"}],"figures":{"kind":"typical"}}]}},"floorInFeet":{"summary":"A laminate floor in a room measured in feet and inches (abridged)","x-request":"/plan.json?v=1&job=flooring&units=ft&length=13ft9in&width=11ft10in&floor=quick&floor.covering=laminate&subfloor=timber&ground=no&fitting=click","value":{"ok":true,"understood":{"job":"flooring","work":"Flooring","answers":{"subfloor":"timber","ground":"no","fitting":"click","floor.covering":"laminate"}},"room":{"floorAreaM2":15.12}}}}}}},"400":{"description":"The figures are not enough, or cannot be used. problems[] names each parameter to add or correct, and ask[] the questions in /ask.json that ask for them. Not a server fault: do not retry with the same parameters.","headers":{"Access-Control-Allow-Origin":{"description":"Any website may read this answer.","schema":{"type":"string","const":"*"}},"Cache-Control":{"description":"public, short-lived","schema":{"type":"string"}},"X-Robots-Tag":{"description":"noindex: the answer is for programs and is not a page for a search engine.","schema":{"type":"string","const":"noindex"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRefused"},"examples":{"missingHeight":{"summary":"Painting needs the ceiling height","x-request":"/plan.json?v=1&job=paint&length=4.2&width=3.6","value":{"ok":false,"error":{"code":"cannot-plan"},"problems":[{"parameter":"height","code":"required","question":"height"}],"ask":["height"]}}}}}}}}}},"components":{"schemas":{"QuestionScript":{"type":"object","required":["api","document","v","instructions","questions"],"properties":{"api":{"type":"string","const":"buildbatch-assistant"},"document":{"type":"string","const":"question-script"},"v":{"type":"integer","const":1},"instructions":{"type":"object","description":"Rules for the assistant: what to ask, what never to do, and what to tell the person afterwards."},"questions":{"type":"array","items":{"$ref":"#/components/schemas/Question"}},"productFigures":{"type":"array","description":"Optional figures a person may read off a tin, pack, roll or box.","items":{"type":"object"}},"typicalRooms":{"type":"array","description":"Offer only if the person does not know their room's size.","items":{"type":"object"}},"typicalOpenings":{"type":"array","description":"The door and window names a call may use.","items":{"type":"object"}}}},"Question":{"type":"object","required":["id","ask","type","required","fills"],"properties":{"id":{"type":"string"},"ask":{"type":"string","description":"The wording to use."},"type":{"type":"string","enum":["choice","yes-no","length","lengths","openings","corners"]},"required":{"type":"boolean","description":"True: the planner refuses without it whenever the question applies."},"requiredWhen":{"type":"object","description":"Another condition under which it is required."},"when":{"type":["object","null"],"description":"When to ask: null is always; otherwise every key must hold (job is one of the values listed)."},"whenText":{"type":"string"},"fills":{"type":"array","items":{"type":"string"},"description":"The /plan.json parameters the answer fills."},"choices":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"label":{"type":"string"},"sets":{"type":"object","additionalProperties":{"type":"string"},"description":"The parameters to send for this answer."}}}},"ifUnknown":{"type":"string","description":"What to do if the person does not know."},"default":{"type":"string","description":"What the planner assumes if the parameter is left out."},"notes":{"type":"array","items":{"type":"string"}}}},"PlanAnswer":{"type":"object","required":["api","document","v","ok","understood","room","lines","listUrl","honesty"],"properties":{"api":{"type":"string","const":"buildbatch-assistant"},"document":{"type":"string","const":"plan"},"v":{"type":"integer","const":1},"ok":{"type":"boolean","const":true},"understood":{"type":"object","description":"What was understood: job, walls, ceiling, trim, room, openings, answers, and the lists defaulted[] (a parameter left out and the value used) and ignored[] (a parameter not read, or without effect, and why). room is {shape: \"rectangle\", lengthM, widthM, heightM}, {shape: \"drawn\", cornersM, heightM} or, for a loft, slab or patio given as an area, {shape: \"area\", areaM2, heightM}; heightM is null when no height was needed or given. With tiles or wallpaper on some walls only (walls.length), room also has wallsLengthM, the length of wall covered in place of the room's perimeter; walls.length on painted walls is listed in ignored[]."},"room":{"type":"object","description":"description, floorAreaM2, perimeterM, ceilingAreaM2, wallAreaM2 {gross, openings, net}, doors, windows. A figure that was not measured is null, never 0: given as an area, perimeterM and the wall areas are null, because how far it is round is not known; a patio, a slab or a loft floor has no ceiling, so ceilingAreaM2 is null."},"summary":{"type":"object","description":"counts, and toBuy[] and toCheck[] as short lines to read out."},"statuses":{"type":"object","description":"What need, check, have and not-needed mean."},"lines":{"type":"array","items":{"$ref":"#/components/schemas/Line"}},"leftovers":{"type":"array","items":{"type":"object"}},"assumptions":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","description":"Safety and condition warnings, each with the line ids it comes from.","items":{"type":"object"}},"listUrl":{"type":"string","format":"uri","description":"Show this to the person: it opens the whole list (the working, tick-off, print, save). Free, no account."},"startUrl":{"type":"string","format":"uri","description":"Opens the planner with the same figures filled in, to change them."},"shops":{"type":"array","items":{"type":"object"}},"honesty":{"type":"object","description":"What to pass on: the template and formula versions, whose figures these are, that nobody outside the build has reviewed it, that there is no price, what the shop links are, and to check the figures and the product's instructions."}}},"Line":{"type":"object","required":["id","label","group","type","status","why"],"properties":{"id":{"type":"string","description":"Stable within the template version."},"label":{"type":"string"},"group":{"type":"string"},"type":{"type":"string","enum":["material","preparation","consumable","tool","ppe"]},"status":{"type":"string","enum":["need","check","have","not-needed"]},"defaultStatus":{"type":"string"},"quantity":{"type":["string","null"],"description":"For example \"1 × 5 L tin (5 L)\". Null when the line has no quantity: see measurement and checkFirst."},"packs":{"type":"array","items":{"type":"object","properties":{"count":{"type":"number"},"label":{"type":"string"},"size":{"type":"number"},"unit":{"type":"string"}}}},"needed":{"type":["object","null"]},"buying":{"type":["object","null"]},"leftOver":{"type":["object","null"]},"measurement":{"type":["object","null"],"description":"A derived figure the list gives when it cannot name a purchase."},"why":{"type":"string"},"checkFirst":{"type":["string","null"],"description":"What decides it, for a line marked check."},"before":{"type":"boolean","description":"True for a line that is not a thing to buy but has to be in place before the work starts (a flat, sound wall to tile on). Say it before the list."},"question":{"type":["object","null"],"description":"The one question the line still asks the person, with the answers it offers: { ask, answers[] }. Its answer changes the list. Null once answered, or when the line asks nothing."},"working":{"type":["string","null"]},"assumptions":{"type":"array","items":{"type":"string"}},"figures":{"type":["object","null"],"description":"kind is \"generic\" (the planner's labelled example), \"user\" (sent in the call) or \"typical\" (a coverage or a pack size found from makers' own figures or products on sale; note says from what)."},"warnings":{"type":"array","items":{"type":"string"}},"find":{"type":["object","null"],"description":"searchWords, kind and shops (shop id to that shop's own search address), or items[] of those for a line that names several things."}}},"PlanRefused":{"type":"object","required":["api","document","v","ok","error","problems","ask"],"properties":{"api":{"type":"string","const":"buildbatch-assistant"},"document":{"type":"string","const":"plan"},"v":{"type":"integer","const":1},"ok":{"type":"boolean","const":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}},"problems":{"type":"array","items":{"type":"object","properties":{"parameter":{"type":["string","null"]},"code":{"type":"string"},"message":{"type":"string"},"question":{"type":["string","null"]}}}},"ask":{"type":"array","items":{"type":"string"},"description":"The question ids in /ask.json to put to the person."},"startUrl":{"type":"string","format":"uri","description":"Opens the planner with what was understood, so the person can fill in the rest there."}}}}},"x-buildbatch":{"jobs":["paint","wallpaper","tiles","flooring","carpet","loft","both","paint-carpet","skirting","plasterboard","concrete","patio"],"questions":"https://buildbatch.co.uk/ask.json","llms":"https://buildbatch.co.uk/llms.txt","note":"The jobs are the values of the job parameter."}}