Features are entities detected inside Blocks — rooms, doors, symbols, walls, dimensions, and annotations. They form a containment tree via parent_feature_id and connect to other entities via Relations. See Features for the full concept.
Endpoints
| Method | Endpoint | Description |
|---|
GET | /features | List features |
GET | /features/{id} | Get feature details |
Features are read-only. They are created automatically during block processing.
Feature Object
| Field | Type | Description |
|---|
id | string | Unique identifier (e.g., ftr_01JABCD123) |
block_id | string | Parent Block |
parent_feature_id | string? | Containment parent feature (null = direct child of block) |
type | string | Entity type: "room", "door", "wall", "duplex_receptacle" |
label | string? | Instance identifier: "201", "104", "AHU-1" |
bounds | object? | Geometry within the block (see below) |
confidence | float? | Detection confidence score (0-1) |
uri | string? | Cropped image URL |
ocr | string? | Extracted text content |
description | string? | Human/LLM-readable summary |
metadata | object? | Domain-specific properties |
created_at | datetime | Creation timestamp |
updated_at | datetime | Last update timestamp |
Bounds Geometry
The bounds field stores the feature’s geometry within its parent block. A type discriminator determines the shape:
| Geometry | Used for | Shape |
|---|
bbox | Symbols, equipment, doors | Axis-aligned bounding box |
polygon | Rooms, areas | Closed polygon with vertices |
polyline | Walls, ducts, pipes | Open line with vertices |
// bbox — a door symbol
{ "type": "bbox", "xmin": 450, "ymin": 320, "xmax": 480, "ymax": 350 }
// polygon — a room boundary
{ "type": "polygon", "points": [[100, 200], [300, 200], [300, 500], [100, 500]] }
// polyline — a wall segment
{ "type": "polyline", "points": [[100, 200], [300, 200], [300, 500]] }
All coordinates are normalized (0-1000) within the parent block’s image. This makes them resolution-independent.
The metadata JSON field carries domain-specific properties, standardized by convention:
| Key | Used on | Example |
|---|
fire_rating | Walls, doors | 2-hr, 45-min |
elevation | Beams, ducts, equipment | 112'-6 |
elevation_top | Beams, structural members | 112'-6 |
elevation_bottom | Beams, structural members | 111'-2 |
material | Walls, doors | HM, WD, concrete |
size | Ducts, pipes | 24x12, 4 |
assembly | Walls | UL U419 |
system | MEP elements | CHW, SAN, SD |
designation | Structural members | W16x40 |
Detected symbol instances (from the symbol detection pipeline) carry matching metadata:
| Key | Type | Description |
|---|
scale | float | Template scale factor relative to legend crop (0.4 - 1.3) |
angle | int | Rotation angle in degrees: 0, 45, 90, 135, 180, 225, 270, 315 |
flipped | bool | Whether the instance is vertically flipped relative to the legend |
template_confidence | float | Raw template matching score before embedding verification |
dinov2_score | float | Embedding similarity score from DINOv2 verification |
The confidence field on symbol features is a hybrid score: template_confidence * dinov2_score. Both component scores are preserved in metadata for downstream filtering.
{
"type": "symbol",
"label": "duplex_receptacle",
"confidence": 0.82,
"bounds": { "type": "bbox", "xmin": 450, "ymin": 320, "xmax": 480, "ymax": 350 },
"metadata": {
"scale": 0.88,
"angle": 90,
"flipped": false,
"template_confidence": 0.91,
"dinov2_score": 0.90
}
}
Legend entry features (from parse_legend) carry symbol definition metadata:
| Key | Type | Description |
|---|
is_text_only | bool | True if the symbol is text-only with no graphic shape |
has_text | bool | True if the symbol graphic contains text characters |
symmetrical | bool | True if the graphic is symmetric along either axis |
is_suffix | bool | True if this entry is a suffix designation (e.g., “WP” for weatherproof) |
suffix | string? | The suffix letter(s) when is_suffix is true |
Text-only legend entries are not template-matched against plan blocks.
Type Vocabulary
type is a free string — the vocabulary of construction entities is too large for an enum. Common types include:
| Category | Types |
|---|
| Architectural | room, door, wall, window, column, stair |
| Electrical | duplex_receptacle, gfci_receptacle, switch, light_fixture, fire_alarm_pull_station |
| Mechanical | duct, diffuser, ahu, vav_box |
| Plumbing | pipe, fixture, floor_drain |
| Structural | beam, joist, footing |
| Annotations | dimension, detail_callout, keynote, section_mark |
| Fire protection | smoke_detector, sprinkler_head, fire_extinguisher |