{"openapi":"3.1.0","info":{"title":"Dibrix Draw: sandbox, public and agent routes (compact)","description":"Compact OpenAPI for agents: no login needed for configurator/sandbox/* and configurator/public/*. Full API: /openapi.json. Axes: x+ east, y+ north, metres.","version":"0.2.0","x-dibrix-registry-version":"2026-10-30.1"},"paths":{"/sessions/{sid}/render.png":{"get":{"tags":["agent-view"],"description":"A PNG of the session, no browser needed. ``view`` = iso|front|back|left|right|top|bottom|camera (default: the agent camera,\nelse iso; ``cam``, ``proj`` (persp|ortho) and ``zoom`` (sel|all) are the browser URL's words). ``w``/``h`` pixels (max 2400, one panel when\n``side_by_side``). ``layers=a,b`` shows only those layers (also hidden ones); ``hide=`` takes layer names, BIM kinds\n(roof), element ids or group names; ``focus`` = element id | selection | ``x0,y0,z0,x1,y1,z1`` (frame it);\n``section=z:2.4`` (keep below; ``-z:2.4`` above; also x:, y:, active or a section plane name);\n``side_by_side=<sid2>`` puts a second session beside this one with the SAME camera (``with_share=`` its token);\n``isolate=<element id|short id|name>[,…]`` draws ONLY those elements (a door with its leaves; no wall, no other door in front of it)\nand frames the first one unless ``focus`` says otherwise: a close-up of one element;\n``bg`` white|black|transparent|hex; ``edges=0`` hides the lines; ``aa`` 1|2|auto. Headers carry the numbers.Agent tool `render` (se). Access: sandbox (anonymous) or logged in. Effect: read.","operationId":"api_render_png_sessions__sid__render_png_get","parameters":[{"$ref":"#/components/parameters/path_sid"},{"$ref":"#/components/parameters/query_view"},{"name":"cam","in":"query","schema":{"type":"string"}},{"name":"projection","in":"query","schema":{"type":"string"}},{"name":"eye","in":"query","schema":{"type":"string"}},{"name":"target","in":"query","schema":{"type":"string"}},{"name":"fov","in":"query","schema":{"type":"number","default":0.0}},{"name":"w","in":"query","schema":{"type":"integer","default":1200}},{"name":"h","in":"query","schema":{"type":"integer","default":800}},{"$ref":"#/components/parameters/query_layers"},{"$ref":"#/components/parameters/query_hide"},{"name":"focus","in":"query","schema":{"type":"string"}},{"name":"section","in":"query","schema":{"type":"string"}},{"name":"side_by_side","in":"query","schema":{"type":"string"}},{"name":"with_share","in":"query","schema":{"type":"string"}},{"name":"bg","in":"query","schema":{"type":"string"}},{"name":"edges","in":"query","schema":{"type":"integer","default":1}},{"name":"aa","in":"query","schema":{"type":"string","default":"auto"}},{"name":"proj","in":"query","schema":{"type":"string"}},{"name":"zoom","in":"query","schema":{"type":"string"}},{"name":"isolate","in":"query","schema":{"type":"string"}},{"$ref":"#/components/parameters/query_share"},{"$ref":"#/components/parameters/header_authorization"}],"responses":{"200":{"description":"Success: image/png"}},"x-dibrix-tool":"render","x-dibrix-access":"sandbox","security":[{},{"cookieAuth":[]}]}},"/sessions/{sid}/render.json":{"get":{"tags":["agent-view"],"description":"What is where in the picture ``render.png`` would give for the same parameters: every object with pixels (id, kind, name, layer,\npixel count, centre, box) and, for ``at=x,y;x,y``, the object under each pixel. No image is sent. Use it to turn «the window at\npixel (500, 300)» into an element id.Agent tool `render_index` (se). Access: sandbox (anonymous) or logged in. Effect: read.","operationId":"api_render_json_sessions__sid__render_json_get","parameters":[{"$ref":"#/components/parameters/path_sid"},{"$ref":"#/components/parameters/query_view"},{"name":"cam","in":"query","schema":{"type":"string"}},{"name":"projection","in":"query","schema":{"type":"string"}},{"name":"eye","in":"query","schema":{"type":"string"}},{"name":"target","in":"query","schema":{"type":"string"}},{"name":"fov","in":"query","schema":{"type":"number","default":0.0}},{"name":"w","in":"query","schema":{"type":"integer","default":1200}},{"name":"h","in":"query","schema":{"type":"integer","default":800}},{"$ref":"#/components/parameters/query_layers"},{"$ref":"#/components/parameters/query_hide"},{"name":"focus","in":"query","schema":{"type":"string"}},{"name":"section","in":"query","schema":{"type":"string"}},{"name":"edges","in":"query","schema":{"type":"integer","default":1}},{"name":"aa","in":"query","schema":{"type":"string","default":"1"}},{"name":"proj","in":"query","schema":{"type":"string"}},{"name":"zoom","in":"query","schema":{"type":"string"}},{"name":"at","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","maximum":2000,"minimum":0,"default":200}},{"name":"isolate","in":"query","schema":{"type":"string"}},{"$ref":"#/components/parameters/query_share"},{"$ref":"#/components/parameters/header_authorization"}],"responses":{"200":{"description":"Success: {elements[{id,kind,pixels,centroid,box}], at[]}"}},"x-dibrix-tool":"render_index","x-dibrix-access":"sandbox","security":[{},{"cookieAuth":[]}]}},"/sessions/{sid}/camera":{"get":{"tags":["agent-view"],"summary":"The agent's own camera (eye, target, projection). The browser camera stays on the client.","description":"The agent camera (default: iso fitted to the model; read before a ``render.png`` without ``view``).Agent tool `get_camera` (se). Access: sandbox (anonymous) or logged in. Effect: read.","operationId":"api_camera_get_sessions__sid__camera_get","parameters":[{"$ref":"#/components/parameters/path_sid"},{"$ref":"#/components/parameters/query_share"},{"$ref":"#/components/parameters/header_authorization"}],"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"get_camera","x-dibrix-access":"sandbox","security":[{},{"cookieAuth":[]}]},"post":{"tags":["agent-view"],"summary":"Set the agent camera: preset (iso/front/...) or eye+target, projection, zoom_to=all|selection|<element-id>. Used by render without view. Does not change the model.","operationId":"api_camera_set_sessions__sid__camera_post","parameters":[{"$ref":"#/components/parameters/path_sid"},{"$ref":"#/components/parameters/query_share"},{"$ref":"#/components/parameters/header_authorization"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CameraIn"}}}},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"set_camera","description":"Agent tool `set_camera` (se). Access: sandbox (anonymous) or logged in. Effect: read.","x-dibrix-access":"sandbox","security":[{},{"cookieAuth":[]}]}},"/sessions/{sid}/scene-summary":{"get":{"tags":["agent-view"],"summary":"Compact JSON about the session without building the mesh: counts per kind, box per element, layers, levels, reference groups. Start here on big files.","description":"Compact JSON: counts per kind, bbox of the model and of every top-level element, layers, levels, reference groups.\nDoes not build the mesh (fast on big files); element ids work in ``focus=`` / ``hide=`` / ``zoom_to``.Agent tool `scene_summary` (se). Access: sandbox (anonymous) or logged in. Effect: read.","operationId":"api_scene_summary_sessions__sid__scene_summary_get","parameters":[{"$ref":"#/components/parameters/path_sid"},{"name":"limit","in":"query","schema":{"type":"integer","maximum":5000,"minimum":0,"default":300}},{"name":"bbox","in":"query","schema":{"type":"integer","default":1}},{"$ref":"#/components/parameters/query_share"},{"$ref":"#/components/parameters/header_authorization"}],"responses":{"200":{"description":"Success: {counts, bbox, groups[], layers[], levels[], references[]}"}},"x-dibrix-tool":"scene_summary","x-dibrix-access":"sandbox","security":[{},{"cookieAuth":[]}]}},"/sessions/{sid}/layers":{"post":{"tags":["agent-view"],"summary":"Show/hide several layers in one call: show=[...], hide=[...], only=[...] (all others off), all=true. Names come from list_tags; an unknown name gives 404 with 'did you mean ...?'; a name ending in * is a prefix ('Sist godkjent*' = every underlay from approved drawings). Changes what the human sees; for a picture only use render?layers=&hide=.","description":"Show / hide layers in bulk (this changes what the human sees). For a picture only, use ``render.png?layers=&hide=``.Agent tool `set_layers` (se). Access: logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_. Effect: write.","operationId":"api_layers_bulk_sessions__sid__layers_post","parameters":[{"$ref":"#/components/parameters/path_sid"},{"$ref":"#/components/parameters/query_share"},{"$ref":"#/components/parameters/header_authorization"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayersIn"}}}},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"set_layers","x-dibrix-access":"share","security":[{"cookieAuth":[]},{"shareToken":[]},{"apiKey":[]}]},"get":{"summary":"Api Layers","operationId":"api_layers_sessions__sid__layers_get","parameters":[{"$ref":"#/components/parameters/path_sid"},{"$ref":"#/components/parameters/header_authorization"}],"responses":{"200":{"description":"Successful Response"}},"security":[{"cookieAuth":[]},{"bearerToken":[]},{"apiKey":[]}]}},"/sessions/{sid}/tags":{"get":{"tags":["agent-view"],"summary":"The tags you CHOOSE from: storeys (own group, with visibility and count) and layers/tags. Use the id/name from here in set_layers, set_selection_props (layer, tags, storey) and render?layers=; never type a name from memory. Unknown names are refused with 'did you mean ...?'.","description":"``list_tags``: the tags to CHOOSE from. ``storeys`` (name, visible, element count) are listed apart from the ``layers``; ``names`` is every\nvalid value for a layer / tag / storey argument. ``id`` is the exact name every other call takes; do not type names, pick them here.Agent tool `list_tags` (se). Access: logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_. Effect: read.","operationId":"api_list_tags_sessions__sid__tags_get","parameters":[{"$ref":"#/components/parameters/path_sid"},{"$ref":"#/components/parameters/query_share"},{"$ref":"#/components/parameters/header_authorization"}],"responses":{"200":{"description":"Success: {storeys:[{id,name,visible,elements}], layers:[{id,name,label,visible,locked,default,elements}], names[]}"}},"x-dibrix-tool":"list_tags","x-dibrix-access":"share","security":[{"cookieAuth":[]},{"shareToken":[]},{"apiKey":[]}]},"post":{"tags":["agent-view"],"description":"New tag: the one explicit, validated way to make one. Unique names, normalised (spaces, case): \"1.etasje\" next to \"1. etasje\"\nis refused (422 with ``did_you_mean``); a near duplicate needs ``confirm_similar``. Returns the new ``name`` and the catalogue.Agent tool `create_tag` (se). Access: logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_. Effect: write.","operationId":"api_create_tag_sessions__sid__tags_post","parameters":[{"$ref":"#/components/parameters/path_sid"},{"$ref":"#/components/parameters/query_share"},{"$ref":"#/components/parameters/header_authorization"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagIn"}}}},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"create_tag","x-dibrix-access":"share","security":[{"cookieAuth":[]},{"shareToken":[]},{"apiKey":[]}]}},"/sessions/{sid}/status":{"get":{"tags":["agent-view"],"summary":"Session status: loading a big file (phase, progress) or ready; use after uploading big igz/skp.","description":"Is the session ready? While a big file opens (``POST /igz?background=1``): ``state`` loading|ready|done|error, ``phase``\n(parse, ready, mesh, index, done), elapsed ms per phase. ``ready`` = the scene exists (``/scene-summary`` is cheap);\n``done`` = first mesh built and index warm. ``summary=1`` adds the light scene summary. ``pages`` = the background\nwarming of the Drawing pages after the last edit / load ({state scheduled|running|done|stopped|off, done, total, ms}).Agent tool `session_status` (se). Access: sandbox (anonymous) or logged in. Effect: read.","operationId":"api_status_sessions__sid__status_get","parameters":[{"$ref":"#/components/parameters/path_sid"},{"name":"summary","in":"query","schema":{"type":"integer","default":0}},{"$ref":"#/components/parameters/query_share"},{"$ref":"#/components/parameters/header_authorization"}],"responses":{"200":{"description":"Success: {state, phase, progress, version, n_groups}"}},"x-dibrix-tool":"session_status","x-dibrix-access":"sandbox","security":[{},{"cookieAuth":[]}]}},"/sessions/{sid}/compare":{"get":{"tags":["agent-view"],"summary":"Compare two sessions (original and interpreted): bbox, area, volume, counts per kind, optionally one picture side by side.","description":"The numbers of two sessions side by side: bbox, area, volume, elements per kind (a = this session, b = ``with``), the\ndelta, and (``picture=1``) the same picture as ``render.png?side_by_side=``, base64 in ``png_base64``. The imported\noriginal (layer ``SKP-import``) is left out unless ``include_reference=1``: the compare is about the model.Agent tool `compare` (se). Access: logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_. Effect: read.","operationId":"api_compare_sessions__sid__compare_get","parameters":[{"$ref":"#/components/parameters/path_sid"},{"name":"with","in":"query","schema":{"type":"string"}},{"name":"with_share","in":"query","schema":{"type":"string"}},{"name":"picture","in":"query","schema":{"type":"integer","default":0}},{"$ref":"#/components/parameters/query_view"},{"$ref":"#/components/parameters/query_layers"},{"$ref":"#/components/parameters/query_hide"},{"name":"include_reference","in":"query","schema":{"type":"integer","default":0}},{"name":"w","in":"query","schema":{"type":"integer","default":900}},{"name":"h","in":"query","schema":{"type":"integer","default":600}},{"$ref":"#/components/parameters/query_share"},{"$ref":"#/components/parameters/header_authorization"}],"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"compare","x-dibrix-access":"share","security":[{"cookieAuth":[]},{"shareToken":[]},{"apiKey":[]}]}},"/configurator/public/catalog":{"get":{"tags":["configurator"],"summary":"Configurator catalog: building types (incl. matrikkel codes), forms, choices.","operationId":"public_catalog_configurator_public_catalog_get","responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_catalog","description":"Agent tool `public_catalog` (pris). Access: open, no login. Effect: read.","x-dibrix-access":"public","security":[]}},"/configurator/public/describe":{"post":{"tags":["configurator"],"summary":"Free text -> changes to the configuration.","description":"Free text -> changes to the configuration (rules always, AI when the server has a key).Agent tool `public_describe` (pris). Access: open, no login. Effect: read.","operationId":"public_describe_configurator_public_describe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DescribeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_describe","x-dibrix-access":"public","security":[]}},"/configurator/public/layout":{"post":{"tags":["configurator"],"summary":"Automatic openings for the choices.","description":"The automatic openings for these choices (what the build would place), to edit on the page.Agent tool `public_layout` (pris). Access: open, no login. Effect: read.","operationId":"public_layout_configurator_public_layout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteIn"}}},"required":true},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_layout","x-dibrix-access":"public","security":[]}},"/configurator/public/forms":{"get":{"tags":["configurator"],"summary":"Every form (rings) at one size.","description":"Every form template at one size (rings for thumbnails) in one request.Agent tool `public_forms` (pris). Access: open, no login. Effect: read.","operationId":"public_forms_configurator_public_forms_get","parameters":[{"name":"width","in":"query","schema":{"type":"number","default":12.0}},{"name":"depth","in":"query","schema":{"type":"number","default":9.0}}],"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_forms","x-dibrix-access":"public","security":[]}},"/configurator/public/modules":{"post":{"tags":["configurator"],"summary":"A form as editable modules.","description":"A form template as editable modules (rectangles with a ridge direction): the plan editor starts here.Agent tool `public_modules` (pris). Access: open, no login. Effect: read.","operationId":"public_modules_configurator_public_modules_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/server__configurator_api__FormIn"}}},"required":true},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_modules","x-dibrix-access":"public","security":[]}},"/configurator/public/validate":{"post":{"tags":["configurator"],"summary":"Walls and opening problems without building.","description":"Walls of the chosen form and the problems with the openings placed on them (no build).Agent tool `public_validate` (pris). Access: open, no login. Effect: read.","operationId":"public_validate_configurator_public_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteIn"}}},"required":true},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_validate","x-dibrix-access":"public","security":[]}},"/configurator/public/compliance":{"post":{"tags":["configurator"],"summary":"Compliance check of a configuration (same fields as quote) + municipality and site facts.","description":"Regelsjekk (T22a): the configured building against national rules (+ the municipality's).Agent tool `public_compliance` (regelsjekk). Access: open, no login. Effect: read.","operationId":"public_compliance_configurator_public_compliance_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceIn"}}}},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_compliance","x-dibrix-access":"public","security":[]},"get":{"tags":["configurator"],"summary":"GET entry: compliance check of a configuration from query parameters.","description":"Compliance check from query parameters only (T33): same engine as ``POST /public/compliance``.Agent tool `public_compliance_get` (regelsjekk). Access: open, no login. Effect: read.","operationId":"public_compliance_get_configurator_public_compliance_get","parameters":[{"$ref":"#/components/parameters/query_type"},{"$ref":"#/components/parameters/query_width"},{"$ref":"#/components/parameters/query_depth"},{"$ref":"#/components/parameters/query_door"},{"$ref":"#/components/parameters/query_window"},{"$ref":"#/components/parameters/query_roof"},{"name":"kommune","in":"query","schema":{"anyOf":[{"type":"string","pattern":"^[a-z0-9]{1,40}$"},{"type":"null"}]}},{"name":"full","in":"query","schema":{"type":"boolean","default":false}},{"name":"site_nabo_m","in":"query","schema":{"description":"avstand til nabogrense, m","type":["string","null"]},"description":"avstand til nabogrense, m"},{"name":"site_annen_bygning_m","in":"query","schema":{"description":"avstand til annen bygning, m","type":["string","null"]},"description":"avstand til annen bygning, m"},{"name":"site_vei_m","in":"query","schema":{"description":"avstand til veiens senterlinje, m","type":["string","null"]},"description":"avstand til veiens senterlinje, m"},{"name":"vei","in":"query","schema":{"description":"veinummer, f.eks. fv157","type":["string","null"]},"description":"veinummer, f.eks. fv157"},{"name":"site_sjo_m","in":"query","schema":{"description":"avstand til sjøen, m","type":["string","null"]},"description":"avstand til sjøen, m"},{"name":"site_elv_bekk_m","in":"query","schema":{"description":"avstand til elv/bekk, m","type":["string","null"]},"description":"avstand til elv/bekk, m"},{"name":"site_vassdrag_m","in":"query","schema":{"description":"avstand til tjern/myr/dam, m","type":["string","null"]},"description":"avstand til tjern/myr/dam, m"},{"name":"gulv_over_terreng_m","in":"query","schema":{"description":"gulv over terreng, m","type":["string","null"]},"description":"gulv over terreng, m"},{"name":"bebygd_eiendom","in":"query","schema":{"description":"1/0","type":["string","null"]},"description":"1/0"},{"name":"over_ledninger","in":"query","schema":{"description":"1/0","type":["string","null"]},"description":"1/0"},{"name":"tomt_m2","in":"query","schema":{"description":"tomteareal, m2","type":["string","null"]},"description":"tomteareal, m2"},{"name":"eksisterende_bya_m2","in":"query","schema":{"description":"eksisterende BYA, m2","type":["string","null"]},"description":"eksisterende BYA, m2"},{"name":"eksisterende_bra_m2","in":"query","schema":{"description":"eksisterende BRA, m2","type":["string","null"]},"description":"eksisterende BRA, m2"},{"name":"mua_m2","in":"query","schema":{"description":"uteoppholdsareal, m2","type":["string","null"]},"description":"uteoppholdsareal, m2"},{"name":"mua_terreng_m2","in":"query","schema":{"description":"MUA paa terreng, m2","type":["string","null"]},"description":"MUA paa terreng, m2"},{"name":"arealformal","in":"query","schema":{"description":"arealformaal","type":["string","null"]},"description":"arealformaal"},{"name":"stoysone","in":"query","schema":{"description":"ingen|gul|rod","type":["string","null"]},"description":"ingen|gul|rod"},{"name":"reguleringsplan","in":"query","schema":{"description":"1/0","type":["string","null"]},"description":"1/0"},{"name":"tiltak","in":"query","schema":{"description":"nybygg|tilbygg","type":["string","null"]},"description":"nybygg|tilbygg"}],"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_compliance_get","x-dibrix-access":"public","security":[]}},"/configurator/sandbox/session":{"post":{"tags":["configurator"],"summary":"Anonymous sandbox session (no login, 30 min idle, max 2 per IP). 404 when the server has no sandbox.","description":"Anonymous editor session for the embedded configurator canvas (T5, Å4).\n\nOff unless ``DIBRIX_SANDBOX=1`` (404). Limits and the allowed command set live in\n``server/sandbox.py``; every later request to the session goes through its gate.Agent tool `sandbox_session` (okt). Access: open, no login. Effect: write.","operationId":"sandbox_session_configurator_sandbox_session_post","responses":{"200":{"description":"Success: {id, ttl_s}"}},"x-dibrix-tool":"sandbox_session","x-dibrix-access":"public","security":[]}},"/configurator/sandbox/session/{sid}/drawing":{"get":{"tags":["configurator"],"summary":"The sandbox drawing as a configuration (boundary, walls, openings).","description":"The visitor's drawing as ``QuoteIn`` fields (boundary, walls, openings; rounded, no lines,\nno prices), so a lead can carry it (T6b). Sandbox sessions only; ``config`` is null while no\nring is closed. Not under ``/sessions/{sid}/``: the sandbox allowlist does not apply.Agent tool `sandbox_get_drawing` (pris). Access: open, no login. Effect: read.","operationId":"sandbox_drawing_configurator_sandbox_session__sid__drawing_get","parameters":[{"$ref":"#/components/parameters/path_sid"}],"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"sandbox_get_drawing","x-dibrix-access":"public","security":[]},"post":{"tags":["configurator"],"summary":"Draw into an EMPTY sandbox session from a configuration: boundary (ring), walls, openings.","description":"Build the (empty) sandbox session from a ``QuoteIn`` (a share link's drawing: ``boundary``,\n``walls``, ``openings``), with the builder ``/public/quote`` uses and the sandbox limits: rate\nlimit, entity cap, only into an empty session. Over the cap the session is released (the\nclient starts a new one). No lines or prices in the answer.Agent tool `sandbox_load_drawing` (pris). Access: open, no login. Effect: write.","operationId":"sandbox_load_drawing_configurator_sandbox_session__sid__drawing_post","parameters":[{"$ref":"#/components/parameters/path_sid"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteIn"}}}},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"sandbox_load_drawing","x-dibrix-access":"public","security":[]}},"/configurator/sandbox/session/{sid}/price":{"post":{"tags":["configurator"],"summary":"Price of the sandbox model with choices (roof, wall type, foundation ...).","description":"Price of the sandbox model WITH the shell's choices (roof, wall type, foundation, interior,\noutdoor, roof windows ...). Same functions as ``/public/quote``, calibration first\n(``scene_quote.quote_scene(choices=)``). Anonymous rule: rounded total, no lines.Agent tool `sandbox_price` (pris). Access: open, no login. Effect: read.","operationId":"sandbox_price_configurator_sandbox_session__sid__price_post","parameters":[{"$ref":"#/components/parameters/path_sid"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxPriceIn"}}}},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"sandbox_price","x-dibrix-access":"public","security":[]}},"/configurator/sandbox/session/{sid}/compliance":{"get":{"tags":["configurator"],"summary":"Compliance check of the sandbox session's model (no login).","description":"Regelsjekk of the sandbox model (read only, no login): same engine as\n``/sessions/{sid}/agent/compliance``, so an agent without an account can check what it drew (T30).Agent tool `sandbox_compliance` (regelsjekk). Access: open, no login. Effect: read.","operationId":"sandbox_compliance_configurator_sandbox_session__sid__compliance_get","parameters":[{"$ref":"#/components/parameters/path_sid"},{"name":"kommune","in":"query","schema":{"type":["string","null"]}},{"name":"type","in":"query","schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"sandbox_compliance","x-dibrix-access":"public","security":[]}},"/configurator/sandbox/session/{sid}/release":{"post":{"tags":["configurator"],"summary":"Release the sandbox session when done.","description":"Free the visitor's own sandbox session on unload (``navigator.sendBeacon``), so the\nper-IP limit does not fill up with dead tabs. Only sessions made by the sandbox route;\nthe id is the capability (128 bit). Idempotent. Off (404) without ``DIBRIX_SANDBOX=1``.Agent tool `sandbox_release` (okt). Access: open, no login. Effect: write.","operationId":"sandbox_release_configurator_sandbox_session__sid__release_post","parameters":[{"$ref":"#/components/parameters/path_sid"}],"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"sandbox_release","x-dibrix-access":"public","security":[]}},"/configurator/public/quote":{"post":{"tags":["configurator"],"summary":"Build a configuration and get a price; plan=true adds the 2D plan, mesh=true the 3D mesh.","description":"Open estimate for the embedded configurator (no login; rate limited).Agent tool `public_quote` (pris). Access: open, no login. Effect: read.","operationId":"public_quote_configurator_public_quote_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteIn"}}}},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_quote","x-dibrix-access":"public","security":[]},"get":{"tags":["configurator"],"summary":"GET entry (web fetch only): price + matrikkel code + compliance + links from query parameters. Site parameters (site_nabo_m, site_annen_bygning_m, site_vei_m, vei, site_sjo_m, gulv_over_terreng_m, bebygd_eiendom, tomt_m2 ...) make unknown findings known (see still_unknown); full=1 returns all findings; the answer has defaults, price_includes/price_excludes and links.plan_page (paste verbatim).","description":"Price + matrikkel code + compliance summary + links, from query parameters only (T33).\n\nFor agents that can only GET. Same engine and rounding as ``POST /public/quote``; read only,\nno session is kept. ``plan=1`` adds the 2D plan document.Agent tool `public_quote_get` (pris). Access: open, no login. Effect: read.","operationId":"public_quote_get_configurator_public_quote_get","parameters":[{"$ref":"#/components/parameters/query_type"},{"$ref":"#/components/parameters/query_width"},{"$ref":"#/components/parameters/query_depth"},{"$ref":"#/components/parameters/query_door"},{"$ref":"#/components/parameters/query_window"},{"$ref":"#/components/parameters/query_roof"},{"name":"plan","in":"query","schema":{"type":"boolean","default":false}},{"name":"kommune","in":"query","schema":{"anyOf":[{"type":"string","pattern":"^[a-z0-9]{1,40}$"},{"type":"null"}]}},{"name":"full","in":"query","schema":{"type":"boolean","default":false}},{"name":"site_nabo_m","in":"query","schema":{"description":"avstand til nabogrense, m","type":["string","null"]},"description":"avstand til nabogrense, m"},{"name":"site_annen_bygning_m","in":"query","schema":{"description":"avstand til annen bygning, m","type":["string","null"]},"description":"avstand til annen bygning, m"},{"name":"site_vei_m","in":"query","schema":{"description":"avstand til veiens senterlinje, m","type":["string","null"]},"description":"avstand til veiens senterlinje, m"},{"name":"vei","in":"query","schema":{"description":"veinummer, f.eks. fv157","type":["string","null"]},"description":"veinummer, f.eks. fv157"},{"name":"site_sjo_m","in":"query","schema":{"description":"avstand til sjøen, m","type":["string","null"]},"description":"avstand til sjøen, m"},{"name":"site_elv_bekk_m","in":"query","schema":{"description":"avstand til elv/bekk, m","type":["string","null"]},"description":"avstand til elv/bekk, m"},{"name":"site_vassdrag_m","in":"query","schema":{"description":"avstand til tjern/myr/dam, m","type":["string","null"]},"description":"avstand til tjern/myr/dam, m"},{"name":"gulv_over_terreng_m","in":"query","schema":{"description":"gulv over terreng, m","type":["string","null"]},"description":"gulv over terreng, m"},{"name":"bebygd_eiendom","in":"query","schema":{"description":"1/0","type":["string","null"]},"description":"1/0"},{"name":"over_ledninger","in":"query","schema":{"description":"1/0","type":["string","null"]},"description":"1/0"},{"name":"tomt_m2","in":"query","schema":{"description":"tomteareal, m2","type":["string","null"]},"description":"tomteareal, m2"},{"name":"eksisterende_bya_m2","in":"query","schema":{"description":"eksisterende BYA, m2","type":["string","null"]},"description":"eksisterende BYA, m2"},{"name":"eksisterende_bra_m2","in":"query","schema":{"description":"eksisterende BRA, m2","type":["string","null"]},"description":"eksisterende BRA, m2"},{"name":"mua_m2","in":"query","schema":{"description":"uteoppholdsareal, m2","type":["string","null"]},"description":"uteoppholdsareal, m2"},{"name":"mua_terreng_m2","in":"query","schema":{"description":"MUA paa terreng, m2","type":["string","null"]},"description":"MUA paa terreng, m2"},{"name":"arealformal","in":"query","schema":{"description":"arealformaal","type":["string","null"]},"description":"arealformaal"},{"name":"stoysone","in":"query","schema":{"description":"ingen|gul|rod","type":["string","null"]},"description":"ingen|gul|rod"},{"name":"reguleringsplan","in":"query","schema":{"description":"1/0","type":["string","null"]},"description":"1/0"},{"name":"tiltak","in":"query","schema":{"description":"nybygg|tilbygg","type":["string","null"]},"description":"nybygg|tilbygg"}],"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_quote_get","x-dibrix-access":"public","security":[]}},"/configurator/public/plan.svg":{"get":{"tags":["configurator"],"summary":"GET entry: the 2D plan of a configuration as SVG (same parameters as quote).","description":"The 2D plan of a configuration as SVG (T33), built in a throwaway session.Agent tool `public_plan_svg` (plan). Access: open, no login. Effect: read.","operationId":"public_plan_svg_configurator_public_plan_svg_get","parameters":[{"$ref":"#/components/parameters/query_type"},{"$ref":"#/components/parameters/query_width"},{"$ref":"#/components/parameters/query_depth"},{"$ref":"#/components/parameters/query_door"},{"$ref":"#/components/parameters/query_window"},{"$ref":"#/components/parameters/query_roof"}],"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_plan_svg","x-dibrix-access":"public","security":[]}},"/configurator/public/summary":{"post":{"tags":["configurator"],"summary":"Short summary of the configuration.","description":"Price per category and a material list (quantities only) for the summary step.Agent tool `public_summary` (pris). Access: open, no login. Effect: read.","operationId":"public_summary_configurator_public_summary_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteIn"}}},"required":true},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_summary","x-dibrix-access":"public","security":[]}},"/configurator/public/drawings":{"post":{"tags":["configurator"],"summary":"Drawing set (PDF) of a configuration; returns a token.","description":"Plan and facades from the editor's drawing set, plus a token for the full PDF.Agent tool `public_drawings` (pris). Access: open, no login. Effect: write.","operationId":"public_drawings_configurator_public_drawings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteIn"}}},"required":true},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_drawings","x-dibrix-access":"public","security":[]}},"/configurator/public/drawings/{token}.pdf":{"get":{"tags":["configurator"],"summary":"Fetch the PDF from public_drawings.","operationId":"public_drawings_pdf_configurator_public_drawings__token__pdf_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_drawings_pdf","description":"Agent tool `public_drawings_pdf` (pris). Access: open, no login. Effect: read.","x-dibrix-access":"public","security":[]}},"/configurator/public/request":{"post":{"tags":["configurator"],"summary":"Send a request (lead) to the supplier. SENDS to people: ask the user first.","description":"Quote request from the embedded page: stored as a lead (consent required).Agent tool `public_request` (pris). Access: open, no login. Effect: external.","operationId":"public_request_configurator_public_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadIn"}}},"required":true},"responses":{"200":{"description":"Successful Response"}},"x-dibrix-tool":"public_request","x-dibrix-access":"public","security":[]}},"/agent":{"get":{"summary":"Agent Guide","description":"Public Markdown guide for remote AI agents (no login, no git); generated from server.agent_registry.","operationId":"agent_guide_agent_get","responses":{"200":{"description":"Successful Response"}}}},"/agent/actions.json":{"get":{"summary":"Every tool with what people call it (phrases, synonyms, when not) and where it is in the app, and every setting with its group. Answer «where do I find …» from here.","description":"Every live tool with phrases / synonyms / where it is in the app, and every setting (dressing A, C19 M5).Agent tool `agent_actions` (okt). Access: open, no login. Effect: read.","operationId":"agent_actions_json_agent_actions_json_get","responses":{"200":{"description":"Success: {ok, tools:[{name, phrases, synonyms?, not_for?, api?, ui?}], settings:[…]}"}},"x-dibrix-tool":"agent_actions","x-dibrix-access":"public","security":[]}},"/agent.json":{"get":{"summary":"Agent Guide Json","description":"Machine-readable twin of /agent: every tool with route, access and input schema.","operationId":"agent_guide_json_agent_json_get","responses":{"200":{"description":"Successful Response"}}}},"/agent/quick":{"get":{"summary":"Agent Quick","description":"GET-only quick start (T33): price, matrikkel code and compliance without POST or a session.","operationId":"agent_quick_agent_quick_get","responses":{"200":{"description":"Successful Response"}}}},"/agent/dibrix-web-mcp.zip":{"get":{"summary":"Agent Mcp Package","description":"The Web MCP as a pip-installable zip (``pip install <this url>``): no repo needed.","operationId":"agent_mcp_package_agent_dibrix_web_mcp_zip_get","responses":{"200":{"description":"Successful Response"}}}}},"components":{"schemas":{"CameraIn":{"properties":{"preset":{"description":"iso|front|back|left|right|top|bottom","type":["string","null"]},"eye":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"description":"[x,y,z] metres, with target"},"target":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}]},"projection":{"description":"perspective|parallel","type":["string","null"]},"fov_deg":{"type":["number","null"]},"zoom_to":{"description":"all | selection | element id | x0,y0,z0,x1,y1,z1","type":["string","null"]},"margin":{"type":"number","maximum":3.0,"minimum":1.0,"default":1.12},"zoom":{"anyOf":[{"type":"number","maximum":20.0,"exclusiveMinimum":0.05},{"type":"null"}],"description":"after fitting: >1 closer, <1 further away"}},"type":"object","description":"Set the agent camera. Give a ``preset`` OR ``eye``+``target``; then ``projection`` / ``fov``; ``zoom_to`` fits the view."},"LayersIn":{"properties":{"show":{"items":{"type":"string"},"type":"array","default":[]},"hide":{"items":{"type":"string"},"type":"array","default":[]},"only":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}]},"all":{"type":"boolean","default":false}},"type":"object","description":"Several layer switches in one call. Order: ``only`` (all others off), ``show``, ``hide``. ``all`` = everything on first."},"TagIn":{"properties":{"name":{"type":"string"},"confirm_similar":{"type":"boolean","default":false}},"type":"object","required":["name"]},"DescribeIn":{"properties":{"text":{"type":"string","maxLength":1200,"minLength":2},"current":{"additionalProperties":true,"type":"object"}},"additionalProperties":false,"type":"object","required":["text"]},"QuoteIn":{"properties":{"type":{"type":"string","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}]},"loft":{"type":"boolean","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"default":22.0},"add_windows":{"type":"boolean","default":true},"add_door":{"type":"boolean","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}]},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}]},"modules":{"anyOf":[{"items":{"$ref":"#/components/schemas/ModuleIn"},"type":"array","maxItems":8,"minItems":1},{"type":"null"}]},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}]},"walls":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallIn"},"type":"array","maxItems":60},{"type":"null"}]},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}]},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","default":"south"},"gate_type":{"type":["string","null"]},"gate_size_dm":{"type":["string","null"]},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/server__configurator_api__OpeningIn"},"type":"array","maxItems":40},{"type":"null"}]},"cladding_type":{"type":"string","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/WallCladIn"},"type":"object","maxProperties":40},{"type":"null"}]},"cladding_material":{"type":"string","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}]},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}]},"corner_boards":{"type":["boolean","null"]},"cladding_on":{"type":["boolean","null"]},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"outdoor":{"anyOf":[{"items":{"$ref":"#/components/schemas/OutdoorIn"},"type":"array","maxItems":4},{"type":"null"}]},"partitions":{"anyOf":[{"items":{"$ref":"#/components/schemas/PartitionIn"},"type":"array","maxItems":4},{"type":"null"}]},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}]},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}]},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}]},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}]},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}]},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}]},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}]},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}]},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","default":"MK06"},"matrikkel_alt":{"type":"boolean","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","default":"net"},"mesh":{"type":"boolean","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"default":0.0},"calibrate":{"type":"boolean","default":false},"plan":{"type":"boolean","default":false}},"additionalProperties":false,"type":"object"},"ModuleIn":{"properties":{"x":{"type":"number","maximum":40.0,"minimum":-40.0,"default":0.0},"y":{"type":"number","maximum":40.0,"minimum":-40.0,"default":0.0},"w":{"type":"number","maximum":20.0,"minimum":1.0},"d":{"type":"number","maximum":20.0,"minimum":1.0},"ridge":{"type":"string","pattern":"^(x|y)$","default":"x"}},"additionalProperties":false,"type":"object","required":["w","d"],"description":"One rectangular module of a free footprint (metres, plan coordinates)."},"FreeWallIn":{"properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2},"b":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2},"storey":{"type":"integer","maximum":3.0,"minimum":0.0,"default":0},"door":{"type":"boolean","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}]},"align":{"type":"string","pattern":"^(left|center|right)$","default":"left"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"minimum":0.03},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["a","b"],"description":"An inner wall drawn by the customer: from ``a`` to ``b`` (plan metres) on storey ``storey`` (0 = ground).\n\n``door`` puts one door in the middle (the old contract). ``openings`` (T6c), when set, replaces\nit: exactly those windows / doors, so a drawing with an opening-free wall round-trips."},"FreeWallOpeningIn":{"properties":{"kind":{"type":"string","pattern":"^(window|door)$","default":"door"},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"default":0.9},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"default":2.1},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}]},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}]},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}]},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}]}},"additionalProperties":false,"type":"object","description":"A window or door in an inner wall; ``pos_m`` = centre, metres from the wall's ``a`` end."},"server__configurator_api__OpeningIn":{"properties":{"id":{"type":"string","maxLength":24,"default":""},"wall":{"type":"string","pattern":"^(south|north|east|west)[2-9]?$","default":"south"},"kind":{"type":"string","pattern":"^(window|door|gate)$","default":"window"},"type":{"type":"string","maxLength":24,"default":""},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"default":1.2},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"default":1.2},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}]},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}]},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}]},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}]}},"additionalProperties":false,"type":"object","description":"One window, door or gate on a named wall (see ``configurator.validate.ring_walls``)."},"WallCladIn":{"properties":{"on":{"type":["boolean","null"]},"type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}]},"material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}]}},"additionalProperties":false,"type":"object","description":"Own cladding on one wall (key as in /validate walls); a missing field keeps the building's."},"OutdoorIn":{"properties":{"kind":{"type":"string","pattern":"^(veranda|balkong|takaltan|terrasse|pergola)$","default":"terrasse"},"side":{"type":"string","pattern":"^(south|north|east|west)$","default":"south"},"width_m":{"type":"number","maximum":12.0,"minimum":1.0,"default":4.0},"depth_m":{"type":"number","maximum":6.0,"minimum":1.0,"default":2.5}},"additionalProperties":false,"type":"object","description":"A veranda / balkong / takaltan / terrasse / pergola on one side of the building."},"PartitionIn":{"properties":{"side":{"type":"string","pattern":"^(south|north|east|west)$","default":"north"},"at_m":{"type":"number","maximum":30.0,"minimum":1.0,"default":2.5},"door":{"type":"boolean","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}]}},"additionalProperties":false,"type":"object","description":"An inner wall parallel to ``side``, ``at_m`` metres in from it, with an optional door."},"server__configurator_api__FormIn":{"properties":{"form_type":{"type":"string","pattern":"^[A-Za-z_]{1,16}$","default":"rect"},"width":{"type":"number","maximum":20.0,"minimum":2.0,"default":8.0},"depth":{"type":"number","maximum":20.0,"minimum":2.0,"default":6.0},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}]},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}]}},"additionalProperties":false,"type":"object"},"ComplianceIn":{"properties":{"type":{"type":"string","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}]},"loft":{"type":"boolean","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"default":22.0},"add_windows":{"type":"boolean","default":true},"add_door":{"type":"boolean","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}]},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}]},"modules":{"anyOf":[{"items":{"$ref":"#/components/schemas/ModuleIn"},"type":"array","maxItems":8,"minItems":1},{"type":"null"}]},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}]},"walls":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallIn"},"type":"array","maxItems":60},{"type":"null"}]},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}]},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","default":"south"},"gate_type":{"type":["string","null"]},"gate_size_dm":{"type":["string","null"]},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/server__configurator_api__OpeningIn"},"type":"array","maxItems":40},{"type":"null"}]},"cladding_type":{"type":"string","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/WallCladIn"},"type":"object","maxProperties":40},{"type":"null"}]},"cladding_material":{"type":"string","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}]},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}]},"corner_boards":{"type":["boolean","null"]},"cladding_on":{"type":["boolean","null"]},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"outdoor":{"anyOf":[{"items":{"$ref":"#/components/schemas/OutdoorIn"},"type":"array","maxItems":4},{"type":"null"}]},"partitions":{"anyOf":[{"items":{"$ref":"#/components/schemas/PartitionIn"},"type":"array","maxItems":4},{"type":"null"}]},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}]},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}]},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}]},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}]},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}]},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}]},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}]},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}]},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","default":"MK06"},"matrikkel_alt":{"type":"boolean","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","default":"net"},"mesh":{"type":"boolean","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"default":0.0},"calibrate":{"type":"boolean","default":false},"plan":{"type":"boolean","default":false},"kommune":{"anyOf":[{"type":"string","pattern":"^[a-z]{1,40}$"},{"type":"null"}]},"site":{"anyOf":[{"$ref":"#/components/schemas/SiteIn"},{"type":"null"}]}},"additionalProperties":false,"type":"object","description":"A configuration (same fields as /public/quote) + optional municipality and site facts."},"SiteIn":{"properties":{"tiltak":{"anyOf":[{"type":"string","pattern":"^(nybygg|tilbygg)$"},{"type":"null"}]},"bebygd_eiendom":{"type":["boolean","null"]},"over_ledninger":{"type":["boolean","null"]},"gulv_over_terreng_m":{"anyOf":[{"type":"number","maximum":5.0,"minimum":-3.0},{"type":"null"}]},"avstand_nabogrense_m":{"anyOf":[{"type":"number","maximum":1000.0,"minimum":0.0},{"type":"null"}]},"avstand_bygning_m":{"anyOf":[{"type":"number","maximum":1000.0,"minimum":0.0},{"type":"null"}]},"avstand_vei_senterlinje_m":{"anyOf":[{"type":"number","maximum":10000.0,"minimum":0.0},{"type":"null"}]},"vei":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}]},"avstand_sjo_m":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}]},"avstand_elv_bekk_m":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}]},"avstand_annet_vassdrag_m":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}]},"tomt_m2":{"anyOf":[{"type":"number","maximum":10000000.0,"exclusiveMinimum":0.0},{"type":"null"}]},"eksisterende_bya_m2":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}]},"eksisterende_bra_m2":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}]},"mua_m2":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"null"}]},"mua_terreng_m2":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"null"}]},"arealformal":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,40}$"},{"type":"null"}]},"stoysone":{"anyOf":[{"type":"string","pattern":"^(ingen|gul|rod)$"},{"type":"null"}]},"reguleringsplan":{"type":["boolean","null"]}},"additionalProperties":false,"type":"object","description":"What the model does not know about the site (all optional; unknown -> «ukjent» finding)."},"SandboxPriceIn":{"properties":{"choices":{"$ref":"#/components/schemas/ChoicesIn"},"type":{"type":["string","null"]}},"additionalProperties":false,"type":"object"},"ChoicesIn":{"properties":{"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}]},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}]},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}]},"roof_form":{"anyOf":[{"type":"string","pattern":"^(gable|hip|shed|flat)$"},{"type":"null"}]},"roof_pitch_deg":{"anyOf":[{"type":"number","maximum":60.0,"minimum":0.0},{"type":"null"}]},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"default":0},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"default":0},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}]},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}]},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","default":"ingen"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","default":"ingen"},"outdoor":{"anyOf":[{"items":{"$ref":"#/components/schemas/OutdoorIn"},"type":"array","maxItems":4},{"type":"null"}]},"cladding_type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}]},"cladding_material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}]},"cladding_on":{"type":["boolean","null"]},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}]},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}]},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}]},"freight_nok":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}]},"freight_status":{"anyOf":[{"type":"string","pattern":"^(kjent|usikker)$"},{"type":"null"}]}},"additionalProperties":false,"type":"object","description":"The shell's picks that change the price (T6c); same names and patterns as ``QuoteIn``.\nCladding type / colours are accepted (they are part of the lead) but do not price."},"LeadIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":2},"email":{"type":"string","maxLength":200,"minLength":5,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$"},"phone":{"type":"string","maxLength":40,"default":""},"message":{"type":"string","maxLength":2000,"default":""},"consent":{"type":"boolean"},"config":{"$ref":"#/components/schemas/QuoteIn"},"estimate_nok":{"type":["integer","null"]},"editor":{"anyOf":[{"$ref":"#/components/schemas/EditorSummary"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["name","email","consent","config"]},"EditorSummary":{"properties":{"price_nok":{"anyOf":[{"type":"integer","maximum":100000000.0,"minimum":0.0},{"type":"null"}]},"area_m2":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}]},"walls":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}]}},"additionalProperties":false,"type":"object"}},"parameters":{"path_sid":{"in":"path","name":"sid","required":true,"schema":{"type":"string"}},"header_authorization":{"in":"header","name":"authorization","schema":{"type":["string","null"]}},"query_share":{"in":"query","name":"share","schema":{"type":["string","null"]}},"query_depth":{"in":"query","name":"depth","schema":{"default":6.0,"type":"number"}},"query_door":{"in":"query","name":"door","schema":{"type":["string","null"]}},"query_hide":{"in":"query","name":"hide","schema":{"type":"string"}},"query_layers":{"in":"query","name":"layers","schema":{"type":"string"}},"query_roof":{"in":"query","name":"roof","schema":{"type":["string","null"]}},"query_type":{"in":"query","name":"type","schema":{"default":"garasje","type":"string"}},"query_view":{"in":"query","name":"view","schema":{"type":"string"}},"query_width":{"in":"query","name":"width","schema":{"default":6.0,"type":"number"}},"query_window":{"in":"query","name":"window","schema":{"type":["string","null"]}}},"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"dibrix_session","description":"Session cookie from POST /auth/login."},"shareToken":{"type":"apiKey","in":"query","name":"share","description":"Share token from the human's «Del øktlenke» (?session=&share=)."},"bearerToken":{"type":"http","scheme":"bearer","description":"Legacy server token (operators only)."},"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"dk_…","description":"Personal API key (agent key) made by the owner in Account → API keys. Scope: one session or a few projects; level read | propose | write. Never in the URL."}}},"x-dibrix-compact":true}