{"openapi":"3.1.0","info":{"title":"WennProperty Public API","version":"0.1.0","description":"Public API for the WennProperty reports platform. Access project data, measurements, and floor plans."},"components":{"schemas":{},"parameters":{}},"paths":{"/health":{"get":{"tags":["Health"],"summary":"Health check","responses":{"200":{"description":"Service is healthy","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]}}}}}}},"/v1/projects":{"get":{"tags":["Projects"],"summary":"List projects","description":"Returns all projects for the authenticated tenant.","security":[{"Bearer":[]}],"responses":{"200":{"description":"List of projects","content":{"application/json":{"schema":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Project identifier"},"createdAt":{"type":"string","nullable":true,"description":"Creation timestamp (ISO 8601)"},"createdBy":{"type":"string","description":"Creator's email or user ID"},"address":{"type":"object","properties":{"street":{"type":"string","nullable":true,"description":"Street name and number"},"postalCode":{"type":"string","nullable":true,"description":"Postal/ZIP code"},"city":{"type":"string","nullable":true,"description":"City name"}},"required":["street","postalCode","city"],"description":"Property address"},"lastUpdated":{"type":"string","nullable":true,"description":"Last update timestamp (ISO 8601)"},"coverPhoto":{"type":"object","nullable":true,"properties":{"photoId":{"type":"string","description":"Photo identifier"},"extension":{"type":"string","description":"File extension (e.g. jpg, png)"}},"required":["photoId","extension"],"description":"Cover photo for the project"},"archived":{"type":"boolean","description":"Whether the project is archived"}},"required":["id","createdAt","createdBy","address","lastUpdated","coverPhoto","archived"]}}},"required":["projects"]}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden — missing required scope"}}}},"/v1/projects/{projectId}/photos/{filename}":{"get":{"tags":["Projects"],"summary":"Get project photo","description":"Returns a single photo as binary data. The filename must include the extension (e.g. `photo-1.jpg`). Optionally resize with width/height query params.","security":[{"Bearer":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"pattern":"^[\\w-]+$","description":"Project ID"},"required":true,"description":"Project ID","name":"projectId","in":"path"},{"schema":{"type":"string","minLength":1,"pattern":"^[\\w-]+\\.\\w+$","description":"Photo filename (photoId.extension, e.g. `photo-1.jpg`)"},"required":true,"description":"Photo filename (photoId.extension, e.g. `photo-1.jpg`)","name":"filename","in":"path"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Resize width in pixels"},"required":false,"description":"Resize width in pixels","name":"width","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Resize height in pixels"},"required":false,"description":"Resize height in pixels","name":"height","in":"query"}],"responses":{"200":{"description":"Photo binary","content":{"image/*":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden — missing required scope"},"404":{"description":"Photo not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/projects/{projectId}":{"get":{"tags":["Projects"],"summary":"Get project details","description":"Returns details for a single project.","security":[{"Bearer":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"pattern":"^[\\w-]+$","description":"Project ID"},"required":true,"description":"Project ID","name":"projectId","in":"path"}],"responses":{"200":{"description":"Project details","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Project identifier"},"createdAt":{"type":"string","nullable":true,"description":"Creation timestamp (ISO 8601)"},"createdBy":{"type":"string","description":"Creator's email or user ID"},"lastUpdated":{"type":"string","nullable":true,"description":"Last update timestamp (ISO 8601)"},"type":{"type":"string","nullable":true,"description":"Report type (e.g. damage_inspection)"},"address":{"type":"object","properties":{"street":{"type":"string","nullable":true,"description":"Street name and number"},"postalCode":{"type":"string","nullable":true,"description":"Postal/ZIP code"},"city":{"type":"string","nullable":true,"description":"City name"}},"required":["street","postalCode","city"],"description":"Property address"},"coverPhoto":{"type":"object","nullable":true,"properties":{"photoId":{"type":"string","description":"Photo identifier"},"extension":{"type":"string","description":"File extension (e.g. jpg, png)"}},"required":["photoId","extension"],"description":"Cover photo for the project"},"photos":{"type":"array","items":{"type":"object","properties":{"photoId":{"type":"string","description":"Photo identifier"},"extension":{"type":"string","description":"File extension (e.g. jpg, png)"}},"required":["photoId","extension"]},"description":"Top-level project photos"},"rooms":{"type":"array","items":{"type":"object","properties":{"roomId":{"type":"string","description":"Room identifier"},"roomName":{"type":"string","nullable":true,"description":"Display name for the room"},"roomType":{"type":"string","enum":["WET_ROOM","KITCHEN","LIVING_ROOM","BEDROOM","OTHER_LIVING_SPACES","HALLWAY","TECHNICAL_ROOM","UNHEATED_ROOM","STORAGE","OTHER","OUTSIDE_AREA"],"description":"Room type classification"},"story":{"type":"number","nullable":true,"description":"Floor/story index (0-based), null if unknown"},"photos":{"type":"array","items":{"type":"object","properties":{"photoId":{"type":"string","description":"Photo identifier"},"extension":{"type":"string","description":"File extension (e.g. jpg, png)"}},"required":["photoId","extension"]},"description":"Photos taken in this room"},"inspectionNotes":{"type":"object","nullable":true,"properties":{"notes":{"type":"string","nullable":true,"description":"Inspection notes text"},"lastUpdated":{"type":"string","nullable":true,"description":"Last update timestamp (ISO 8601)"}},"required":["notes","lastUpdated"],"description":"Inspector notes for this room"}},"required":["roomId","roomName","roomType","story","photos","inspectionNotes"]},"description":"Indoor rooms"},"outsideAreas":{"type":"array","items":{"type":"object","properties":{"roomId":{"type":"string","description":"Room identifier"},"roomName":{"type":"string","nullable":true,"description":"Display name for the room"},"roomType":{"type":"string","enum":["WET_ROOM","KITCHEN","LIVING_ROOM","BEDROOM","OTHER_LIVING_SPACES","HALLWAY","TECHNICAL_ROOM","UNHEATED_ROOM","STORAGE","OTHER","OUTSIDE_AREA"],"description":"Room type classification"},"story":{"type":"number","nullable":true,"description":"Floor/story index (0-based), null if unknown"},"photos":{"type":"array","items":{"type":"object","properties":{"photoId":{"type":"string","description":"Photo identifier"},"extension":{"type":"string","description":"File extension (e.g. jpg, png)"}},"required":["photoId","extension"]},"description":"Photos taken in this room"},"inspectionNotes":{"type":"object","nullable":true,"properties":{"notes":{"type":"string","nullable":true,"description":"Inspection notes text"},"lastUpdated":{"type":"string","nullable":true,"description":"Last update timestamp (ISO 8601)"}},"required":["notes","lastUpdated"],"description":"Inspector notes for this room"}},"required":["roomId","roomName","roomType","story","photos","inspectionNotes"]},"description":"Outside areas (facades, gardens, etc.)"},"aiSummary":{"type":"object","nullable":true,"properties":{"text":{"type":"string","nullable":true,"description":"AI-generated summary text"},"promptTitle":{"type":"string","nullable":true,"description":"Prompt template used for generation"},"generatedAt":{"type":"string","nullable":true,"description":"Generation timestamp (ISO 8601)"}},"required":["text","promptTitle","generatedAt"],"description":"AI-generated inspection summary"},"inspectionNotes":{"type":"object","nullable":true,"properties":{"notes":{"type":"string","nullable":true,"description":"Inspection notes text"},"lastUpdated":{"type":"string","nullable":true,"description":"Last update timestamp (ISO 8601)"}},"required":["notes","lastUpdated"],"description":"Top-level inspector notes"},"archived":{"type":"boolean","description":"Whether the project is archived"}},"required":["id","createdAt","createdBy","lastUpdated","type","address","coverPhoto","photos","rooms","outsideAreas","aiSummary","inspectionNotes","archived"]}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden — missing required scope"},"404":{"description":"Project not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/projects/{projectId}/measurements":{"get":{"tags":["Measurements"],"summary":"Get project measurements","description":"Returns measurements derived from the project's 3D model: floor area, wall surfaces, molding lengths, and opening counts per room, plus per-wall detail with nested doors/windows/openings, room objects, and aggregated project totals. Only available for projects with 3D model data.","security":[{"Bearer":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"pattern":"^[\\w-]+$","description":"Project ID"},"required":true,"description":"Project ID","name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^[\\w-]+$","description":"Filter to a single room by ID"},"required":false,"description":"Filter to a single room by ID","name":"roomId","in":"query"}],"responses":{"200":{"description":"Room-level measurements with project totals","content":{"application/json":{"schema":{"type":"object","properties":{"rooms":{"type":"array","items":{"type":"object","properties":{"roomId":{"type":"string","description":"Room identifier"},"roomName":{"type":"string","nullable":true,"description":"Display name for the room"},"roomType":{"type":"string","description":"Room type classification (e.g. LIVING_ROOM, KITCHEN, WET_ROOM)"},"story":{"type":"number","nullable":true,"description":"Floor/story index (0-based), null if unknown"},"floorArea":{"type":"number","description":"Floor area in m²"},"grossWallArea":{"type":"number","description":"Total wall area including openings in m²"},"netWallArea":{"type":"number","description":"Wall area minus openings in m²"},"netWallAreaNS":{"type":"number","description":"Wall area minus openings per NS 3420 standard in m²"},"moldingLengthFloor":{"type":"number","description":"Total floor molding length in m"},"moldingLengthCeiling":{"type":"number","description":"Total ceiling molding length in m"},"moldingLengthOpening":{"type":"number","description":"Total opening molding length in m"},"doorCount":{"type":"integer","description":"Number of doors in this room"},"windowCount":{"type":"integer","description":"Number of windows in this room"},"openingCount":{"type":"integer","description":"Number of open passages in this room"},"walls":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Element ID, matches data-id in floor plan SVG"},"width":{"type":"integer","description":"Wall width in cm"},"height":{"type":"integer","description":"Wall height in cm"},"grossArea":{"type":"number","description":"Total wall area including openings in m²"},"netArea":{"type":"number","description":"Wall area minus openings in m²"},"netAreaNS":{"type":"number","description":"Wall area minus openings per NS 3420 standard in m². NS 3420 uses standardized deduction rules for openings"},"moldingLengthFloor":{"type":"number","description":"Floor molding length along wall base in m"},"moldingLengthCeiling":{"type":"number","description":"Ceiling molding length along wall top in m"},"moldingLengthOpening":{"type":"number","description":"Total molding length around openings in this wall in m"},"doors":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Element ID, matches data-id in floor plan SVG"},"width":{"type":"integer","description":"Width in cm"},"height":{"type":"integer","description":"Height in cm"},"area":{"type":"number","description":"Area in m²"},"moldingLength":{"type":"number","description":"Molding/trim length around opening in m"}},"required":["id","width","height","area","moldingLength"]},"description":"Doors in this wall"},"windows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Element ID, matches data-id in floor plan SVG"},"width":{"type":"integer","description":"Width in cm"},"height":{"type":"integer","description":"Height in cm"},"area":{"type":"number","description":"Area in m²"},"moldingLength":{"type":"number","description":"Molding/trim length around opening in m"}},"required":["id","width","height","area","moldingLength"]},"description":"Windows in this wall"},"openings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Element ID, matches data-id in floor plan SVG"},"width":{"type":"integer","description":"Width in cm"},"height":{"type":"integer","description":"Height in cm"},"area":{"type":"number","description":"Area in m²"},"moldingLength":{"type":"number","description":"Molding/trim length around opening in m"}},"required":["id","width","height","area","moldingLength"]},"description":"Open passages (no door/window) in this wall"}},"required":["id","width","height","grossArea","netArea","netAreaNS","moldingLengthFloor","moldingLengthCeiling","moldingLengthOpening","doors","windows","openings"]},"description":"Per-wall measurements with nested openings"},"objects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Object identifier"},"category":{"type":"string","description":"Object category (e.g. bathtub, refrigerator, sink, toilet, washerDryer)"},"width":{"type":"integer","description":"Width in cm"},"height":{"type":"integer","description":"Height in cm"},"children":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Object identifier"},"category":{"type":"string","description":"Object category (e.g. sink, toilet)"},"width":{"type":"integer","description":"Width in cm"},"height":{"type":"integer","description":"Height in cm"},"children":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"category":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"},"children":{"type":"array","items":{"nullable":true}}},"required":["id","category","width","height","children"]}}},"required":["id","category","width","height","children"]},"description":"Nested child objects"}},"required":["id","category","width","height","children"]},"description":"Detected furniture and fixtures"}},"required":["roomId","roomName","roomType","story","floorArea","grossWallArea","netWallArea","netWallAreaNS","moldingLengthFloor","moldingLengthCeiling","moldingLengthOpening","doorCount","windowCount","openingCount","walls","objects"]},"description":"Per-room measurements"},"totals":{"type":"object","properties":{"floorArea":{"type":"number","description":"Total floor area across all rooms in m²"},"grossWallArea":{"type":"number","description":"Total gross wall area in m²"},"netWallArea":{"type":"number","description":"Total net wall area in m²"},"netWallAreaNS":{"type":"number","description":"Total net wall area per NS 3420 in m²"},"moldingLengthFloor":{"type":"number","description":"Total floor molding length in m"},"moldingLengthCeiling":{"type":"number","description":"Total ceiling molding length in m"},"moldingLengthOpening":{"type":"number","description":"Total opening molding length in m"},"doorCount":{"type":"integer","description":"Total number of doors"},"windowCount":{"type":"integer","description":"Total number of windows"},"openingCount":{"type":"integer","description":"Total number of open passages"},"rooms":{"type":"integer","description":"Number of rooms"},"stories":{"type":"integer","description":"Number of stories/floors"}},"required":["floorArea","grossWallArea","netWallArea","netWallAreaNS","moldingLengthFloor","moldingLengthCeiling","moldingLengthOpening","doorCount","windowCount","openingCount","rooms","stories"],"description":"Aggregated project totals"}},"required":["rooms","totals"]}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden — missing required scope"},"404":{"description":"Project not found or no scan data available","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/projects/{projectId}/floorplan":{"get":{"tags":["Floor Plans"],"summary":"Get project floor plan","description":"Returns an SVG floor plan generated from LiDAR scan data. Select a specific story with the `story` query parameter (0-indexed, defaults to 0). Only available for projects with LiDAR scan data.","security":[{"Bearer":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"pattern":"^[\\w-]+$","description":"Project ID"},"required":true,"description":"Project ID","name":"projectId","in":"path"},{"schema":{"type":"integer","nullable":true,"minimum":0,"description":"Story/floor index (0-indexed, defaults to 0)"},"required":false,"description":"Story/floor index (0-indexed, defaults to 0)","name":"story","in":"query"},{"schema":{"type":"string","enum":["0","1","true","false"],"description":"Show wall measurements (defaults to true)"},"required":false,"description":"Show wall measurements (defaults to true)","name":"showMeasurements","in":"query"},{"schema":{"type":"string","enum":["0","1","true","false"],"description":"Show room labels (defaults to true)"},"required":false,"description":"Show room labels (defaults to true)","name":"showLabels","in":"query"}],"responses":{"200":{"description":"Floor plan SVG image","content":{"image/svg+xml":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden — missing required scope"},"404":{"description":"Project not found, no scan data, or invalid story index","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/projects/{projectId}/roof":{"get":{"tags":["Roof Geometry"],"summary":"Get roof measurements","description":"Returns roof geometry measurements derived from aerial/satellite data. Includes per-building and per-surface details: slope, direction, 2D/3D area, perimeter, altitude, and height above ground. Only available for projects with an associated address.","security":[{"Bearer":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"pattern":"^[\\w-]+$","description":"Project ID"},"required":true,"description":"Project ID","name":"projectId","in":"path"},{"schema":{"type":"string","description":"Filter to a single building by ID"},"required":false,"description":"Filter to a single building by ID","name":"buildingId","in":"query"}],"responses":{"200":{"description":"Roof measurements grouped by building","content":{"application/json":{"schema":{"type":"object","properties":{"buildings":{"type":"array","items":{"type":"object","properties":{"buildingId":{"type":"string","description":"Building identifier"},"displayName":{"type":"string","description":"Human-readable building name"},"surfaces":{"type":"array","items":{"type":"object","properties":{"surfaceId":{"type":"string","description":"Roof surface identifier"},"slope":{"type":"number","description":"Surface slope from Norkart API (gradians)"},"direction":{"type":"number","description":"Surface direction from Norkart API (UTM zone 33 grid bearing)"},"calculatedSlope":{"type":"number","description":"True slope in degrees computed from polygon geometry via Newell's method (0 = flat, 90 = vertical)"},"calculatedDirection":{"type":"number","description":"True compass direction in degrees computed from polygon geometry (0 = north, 90 = east, 180 = south, 270 = west)"},"area2d":{"type":"number","description":"Projected 2D area in m²"},"area3d":{"type":"number","description":"True 3D surface area in m² (greater than 2D for pitched surfaces)"},"perimeter":{"type":"number","description":"Surface perimeter in m"},"vertices":{"type":"integer","description":"Number of vertices in the surface polygon"},"minRoofAltitude":{"type":"number","description":"Lowest roof altitude in m above sea level"},"maxRoofAltitude":{"type":"number","description":"Highest roof altitude in m above sea level"},"minHeightAboveGround":{"type":"number","description":"Minimum height above ground level in m"},"maxHeightAboveGround":{"type":"number","description":"Maximum height above ground level in m"}},"required":["surfaceId","slope","direction","calculatedSlope","calculatedDirection","area2d","area3d","perimeter","vertices","minRoofAltitude","maxRoofAltitude","minHeightAboveGround","maxHeightAboveGround"]},"description":"Roof surfaces for this building"},"totalRoofArea":{"type":"number","description":"Total 3D roof area for this building in m²"},"totalRoofArea2d":{"type":"number","description":"Total projected 2D roof area for this building in m²"},"surfaceCount":{"type":"integer","description":"Number of roof surfaces"},"wallCount":{"type":"integer","description":"Number of walls"}},"required":["buildingId","displayName","surfaces","totalRoofArea","totalRoofArea2d","surfaceCount","wallCount"]},"description":"Roof data grouped by building"},"totals":{"type":"object","properties":{"buildings":{"type":"integer","description":"Number of buildings"},"surfaces":{"type":"integer","description":"Total number of roof surfaces"},"totalRoofArea":{"type":"number","description":"Total 3D roof area across all buildings in m²"},"totalRoofArea2d":{"type":"number","description":"Total projected 2D roof area across all buildings in m²"},"walls":{"type":"integer","description":"Total number of walls"}},"required":["buildings","surfaces","totalRoofArea","totalRoofArea2d","walls"],"description":"Aggregated totals across all buildings"}},"required":["buildings","totals"]}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden — missing required scope"},"404":{"description":"Project not found or no roof geometry available","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/projects/{projectId}/roof/svg":{"get":{"tags":["Roof Geometry"],"summary":"Get roof geometry SVG","description":"Returns a 2D top-down SVG visualization of roof geometry, derived from aerial/satellite data. Includes rich data attributes on every element: surface areas, edge lengths, directions, vertex altitudes, and heights above ground. Only available for projects with an associated address.","security":[{"Bearer":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"pattern":"^[\\w-]+$","description":"Project ID"},"required":true,"description":"Project ID","name":"projectId","in":"path"}],"responses":{"200":{"description":"Roof geometry SVG image","content":{"image/svg+xml":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden — missing required scope"},"404":{"description":"Project not found or no roof geometry available","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/projects/{projectId}/roof/photo":{"get":{"tags":["Roof Geometry"],"summary":"Get aerial roof photo","description":"Returns a composite aerial/orthophoto image of the project's roof area. The image is stitched from map tiles based on the roof geometry's GPS bounds. By default, roof surface outlines are overlaid in magenta to help correlate geometry with the photo. Set overlay=false for the raw aerial photo. Use this to visually identify pipes, vents, skylights, and other features not captured in the geometry. Only available for projects with an associated address and roof geometry data.","security":[{"Bearer":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"pattern":"^[\\w-]+$","description":"Project ID"},"required":true,"description":"Project ID","name":"projectId","in":"path"},{"schema":{"type":"integer","minimum":16,"maximum":21,"description":"Tile zoom level (16–21, default 20). Higher = more detail."},"required":false,"description":"Tile zoom level (16–21, default 20). Higher = more detail.","name":"zoom","in":"query"},{"schema":{"type":"string","enum":["0","1","true","false"],"description":"Include roof plan outline overlay (default true). Set to false for the raw aerial photo."},"required":false,"description":"Include roof plan outline overlay (default true). Set to false for the raw aerial photo.","name":"overlay","in":"query"}],"responses":{"200":{"description":"Aerial photo of the roof area","content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden — missing required scope"},"404":{"description":"Project not found, no roof geometry, or no aerial imagery available","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/projects/{projectId}/walls":{"get":{"tags":["Exterior Walls"],"summary":"Get exterior wall measurements","description":"Returns exterior wall geometry derived from roof data. Each wall includes its type (ground or shared/dormer), area, 3D vertices, 2D projected corners, and links to the roof surfaces and edges it was derived from. Use surfaceIds and edgeIds to correlate with get_roof_measurements and get_roof_svg. Only available for projects with an associated address.","security":[{"Bearer":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"pattern":"^[\\w-]+$","description":"Project ID"},"required":true,"description":"Project ID","name":"projectId","in":"path"},{"schema":{"type":"string","description":"Filter to a single building by ID"},"required":false,"description":"Filter to a single building by ID","name":"buildingId","in":"query"}],"responses":{"200":{"description":"Exterior wall measurements grouped by building","content":{"application/json":{"schema":{"type":"object","properties":{"buildings":{"type":"array","items":{"type":"object","properties":{"buildingId":{"type":"string","description":"Building identifier"},"displayName":{"type":"string","description":"Human-readable building name"},"walls":{"type":"array","items":{"type":"object","properties":{"wallId":{"type":"string","description":"Wall identifier (e.g. BYG-1-W1)"},"wallType":{"type":"string","enum":["ground","shared"],"description":"Wall type: 'ground' = true exterior wall from roof edge to ground, 'shared' = transition wall between surfaces at different altitudes (dormers, eave steps)"},"direction":{"type":"integer","description":"Compass direction the wall faces (0–360°, 0=north, 90=east, 180=south, 270=west)"},"surfaceIds":{"type":"array","items":{"type":"string"},"description":"Roof surface IDs this wall was derived from (matches IDs in get_roof_measurements)"},"edgeIds":{"type":"array","items":{"type":"string"},"description":"Roof edge IDs this wall projects from (matches data-edge-id in roof SVG)"},"area":{"type":"number","description":"Wall area in m²"},"vertices":{"type":"array","items":{"type":"array","items":{"type":"number"}},"description":"Wall polygon vertices in GPS coordinates [lon, lat, alt][]"},"corners":{"type":"array","items":{"type":"array","items":{"type":"number"}},"description":"Wall projected onto 2D plane as [u, v][] in meters — for width/height reasoning"}},"required":["wallId","wallType","direction","surfaceIds","edgeIds","area","vertices","corners"]},"description":"Exterior walls for this building"},"totalWallArea":{"type":"number","description":"Total wall area for this building in m²"},"wallCount":{"type":"integer","description":"Number of walls"}},"required":["buildingId","displayName","walls","totalWallArea","wallCount"]},"description":"Wall data grouped by building"},"totals":{"type":"object","properties":{"buildings":{"type":"integer","description":"Number of buildings"},"walls":{"type":"integer","description":"Total number of walls"},"totalWallArea":{"type":"number","description":"Total wall area across all buildings in m²"}},"required":["buildings","walls","totalWallArea"],"description":"Aggregated totals across all buildings"}},"required":["buildings","totals"]}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden — missing required scope"},"404":{"description":"Project not found or no roof geometry available","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/projects/{projectId}/walls/svg":{"get":{"tags":["Exterior Walls"],"summary":"Get exterior wall SVG","description":"Returns an unfolded building elevation SVG — all exterior walls laid out side by side like unfolding a cardboard box. Ground walls use solid strokes, shared/dormer walls use dashed strokes. Each wall polygon carries data attributes (wall ID, type, area, surface/edge IDs) for correlation with get_walls, get_roof_measurements, and get_roof_svg. Only available for projects with an associated address.","security":[{"Bearer":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"pattern":"^[\\w-]+$","description":"Project ID"},"required":true,"description":"Project ID","name":"projectId","in":"path"}],"responses":{"200":{"description":"Unfolded wall elevation SVG image","content":{"image/svg+xml":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden — missing required scope"},"404":{"description":"Project not found or no roof geometry available","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}}}}